响应式编程初体验

199 阅读3分钟

近来,响应式编程一词出现的频率很高,有很多框架都采用了响应式的编程思想,例如Rxswift,Flutter,ReactiveObjc,以及苹果今年的SwiftUI 和 Combine , 可以看出响应式编程思想有着极大的魅力, 那响应式思想究竟是什么呢?

在日常开发中,经常需要处理一些事件,下面的代码你一定很熟悉

btn.
addTarget(self, action: #selector(btnAction), for: .touchUpInside)

let tap = 
UITapGestureRecognizer.init(target: self, action: #selector(tapAction))
aView.addGestureRecognizer(tap)

NotificationCenter.
default.
addObserver(self, 
selector: #selector(notificationAction), 
name: Notification.Name(rawValue: "a notification name") , 
object: nil)

然后在某处写上对应的方法,(如果你忘记写了,你的程序可能会崩溃)

@objc func btnAction(sender:UIButton) {
}

@objc func tapAction(sender:UITapGestureRecognizer) {
}

@objc func notificationAction(sender:NSNotification) {
}

上面的流程是开发中最常见的开发流程
1.注册事件
2.添加响应方法

但是这种流程有一些弊端
1.事件和处理的逻辑分开了
2.代码分散,不好管理.

注册事件在一处,事件响应在其它地方. 有时项目开发急的话,这种分散的处理逻辑也会导致效率降低.

当需要处理的交互和事件逻辑比较多时,像这样注册和添加响应事件的代码就会更多,使逻辑分散在代码各处.可能当时你是比较清楚的,但是当过去一段时间后,再来维护这些,或者修改一些逻辑的时候,难度就会增加,而且分散的逻辑会导致进行的修改在代码层面难以测试.

一个操作或者说业务的完整逻辑可以概括成,

触发 + 响应

触发点触发我们的业务逻辑和操作,响应这次触发之后返回此次操作和业务的结果.
回到上面的例子,按钮,和手势的事件触发由系统处理,通知可能由系统或者我们来触发. 系统API把像这样原本构成一个完整逻辑的操作(触发 + 响应)分开了, 这也是导致代码维护难度增加的原因.

有没有一种方式可以将 "触发" 和 "响应" 放到一起呢?

Rxswift 和 ReactiveObjc 可以帮你做到.先来感受前面的例子改造后的样子.

 button .rx .tap
            .subscribe(onNext: { () in
                //点击事件的处理逻辑
            })


let tap = UITapGestureRecognizer()
tap.rx.event.subscribe(onNext: { (tap) in
           //tap 手势处理逻辑
        })

NotificationCenter
.default
.rx
.notification(Notification.Name(rawValue: "a notification name"))
.subscribe(onNext: { (noti) in
            //通知事件处理逻辑
 })

改造后可以看出所有代码都在一起 所有处理事件的代码都被封装到一个叫 onNext 的闭包中 ,没有被分割成两处,可以方便的修改,或者分析这些事件的逻辑.

说了这么多,好像响应式这个词被我丢了, 拿 notification 的例子来说, 有些通知事件,比如键盘事件,触发是由系统触发,我们通常不用干涉,我们只要关注我们 响应键盘弹出事件的方法即可,关注我们要在键盘弹出时做些什么,而不是什么时候触发键盘弹出. 还记得 "触发 + 响应" 吗? 有时候只需要关注"响应".这就是我理解的响应式.

Rxswift 给我们封装了很多 "触发+响应"来供开发者使用,把"触发"封装了起来,然后把"响应"通过闭包的方式暴露出来让开发者处理, 提高开发效率,降低维护成本.


 小编这呢,给大家推荐一个优秀的iOS交流平台,平台里的伙伴们都是非常优秀的iOS开发人员,我们专注于技术的分享与技巧的交流,大家可以在平台上讨论技术,交流学习。欢迎大家的加入(想要进入的可加小编微信:17336563535)。

来源:本文为第三方转载,如有侵权请联系小编删除。