RxSwift - 入门介绍
RxSwift - 入门介绍什么是Rx如果是iOS程序员,那么大家肯定熟悉action-target模式、delegate模式或者通知(notification),这些模式基本都是用来解决事件响应的问题,action-target就不用说了,UIButton就是基于这个模式来响应事件的,delegate也是一样的,比如说UIAlertViewDelegate,这个协议定义了很多UIAlertView事件响应的回调方法,Notification有点区别,它是采用订阅-通知的方式,并且可以有多个响应的对象。 Rx全名是ReactiveX,是一个函数响应式框架,遵循Functional Reactive Programming(FRP)的设计规范,它把事件封装成信号流,并采用观察者模式来实现。 例子(HelloWorld!)先来看个简单的例子,这里是demo工程,下载到本地,用XCode打开,点击按钮的时候,可以看到输出了"HelloWorld!",打开RxSwiftViewController文件,看按钮响应的那段代码。 @objc func onClicked(_ sender: Any?) { let observable = Observable<String>.create { (observer) -> Disposable in observer.on(Event.next("HelloWorld!")) observer.onCompleted() return Disposables.create() } let disposeBag = DisposeBag() observable.subscribe(onNext: { (str) in print(str) },onError: { (error) in },onCompleted: { }).disposed(by: disposeBag) } 在方法里面先定义了一个Observable对象,这个叫可观察序列(后面会解释),这个对象是可以订阅的,相当于观察者模式中的被观察者,subscribe便是它的订阅方法,当调用subscribe的时候,会触发observer.on(Event.next("next"))和observer.onCompleted()的执行,并且会在onNext和onCompleted中响应,所以就打印出了"HelloWorld!"。 这里是最简单的情况,实际运用中会碰到更复杂的情况,不过别当心,先把简单的理解透了,复杂的就好理解了。 可观察序列(Observable)可观察序列,也就是能发送一些事件流的事物,什么是事件流?最常见的按钮的连续点击便是一个事件流。 可观察序列可以发送三种类型的事件:1、发送数据(Next),2、遇到问题(Error),3、发送完成(Completed)。比如上面的例子,observable发送了一个Next事件“observer.on(Event.next("HelloWorld!"))”以及一个Completed事件“observer.onCompleted()”。当遇到错误的时候,还可以发送Error事件。 事件的定义如下,是个枚举 public enum Event<Element> { /// Next element is produced. case next(Element) /// Sequence terminated with an error. case error(Swift.Error) /// Sequence completed successfully. case completed } 观察者观察者可以订阅序列的事件。比如上面的代码里的subscribe。原型如下: func subscribe(onNext: ((Self.E) -> Swift.Void)? = default,onError: ((Error) -> Swift.Void)? = default,onCompleted: (() -> Swift.Void)? = default,onDisposed: (() -> Swift.Void)? = default) -> Disposable 订阅的时候把对应的响应放进对应的闭包里。 订阅的序列有两种类型:
总结Rx其实很简单,就是一个观察者模式的应用,Observable发送事件,observer订阅事件,收到相应的事件作出相应的处理。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 什么是rubyGems env中的“用户安装目录”
- Flex Application 初始化事件的顺序
- 【Flutter 混合开发】与原生通信-BasicMessageChannel
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
- 常用的正则表达式去重、匹配img标签、13位时间戳
- ruby – Sinatra – 如何计算每个请求统计信息的响应时间?
- qt XML文件中node的删除方法
- Swift-->Realm 1.0.2 数据库上手指南
- ruby-on-rails – any_instance should_receive无法正常工作
- ruby – 如何在FactoryGirl工厂中定义方法?