RxSwift 是什么
RxSwift 是Rx框架的 Swift 实现.
关于 Rx 框架引用一段介绍https://mcxiaoke.gitbooks.io/rxdocs/content/Intro.html
ReactiveX是Reactive Extensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,由微软的架构师Erik Meijer领导的团队开发,在2012年11月开源,Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流,Rx库支持.NET、JavaScript和C++,Rx近几年越来越流行了,现在已经支持几乎全部的流行编程语言了,Rx的大部分语言库由ReactiveX这个组织负责维护,比较流行的有RxJava/RxJS/Rx.NET,社区网站是 reactivex.io。
框架的主要目的是为了处理异步数据流. 例如, 异步网络请求, 事件响应等
RxSwift 的意义及为何要使用这个框架
简单来说, 你可以更方便高效的写代码. 例如官方这个炫酷的 demo, 你也可以很方便的写出来
Github 搜索
而且合理使用各种合并, map, flatmap 等, 你几乎可以完成所有的事情.
入门
首先我们要导入 RxSwift. 只需要在 Pod 文件中加入这一行
pod 'RxSwift', '~> 3.0'
成功导入之后,
我们来看一个最基本的 Hello, word
class SomeViewController: UIViewController {
...
let disposeBag = DisposeBag()
....
override func viewDidLoad() {
Observable.just("Hello, world").subscribe(onNext: { (str) in
print(str)
}).disposed(by: disposeBag)
}
...
这个示例会输出Hello, world
不过你现在觉得一头雾水, 这是什么? Observable
是什么东西?
基础概念
RxSwift 中大量使用到观察者模式. 这个模式在 iOS 中应用最广泛的就是通知了.
Observable
Observable
是一个可观察的对象, 类似于 NotificationCenter
我们使用 just
这个工厂方法, 创建了一个可观察者对象, 并在其中放了一个事件, 这个事件内容就是这个"Hello, world" 字符串, 并随即事件链结束. 相当于使用 NotificationCenter.default.post(xxx)
, 不过这里略有不同的是, 通知会立即发送, 而可观察对象通常会在有订阅者订阅的时候才会创建事件并发送.
subscribe
subscribe(onNext:)
则是订阅, 相当于 NotificationCenter.default.addObserver
. Observable 中有三种事件, 分别是完成completed
, 错误 error(Error)
, 下一个"next(Element)". 这里的 next 事件看似难以理解, 其实只是说发生了某一个事件而已. 关于事件, 后面我们再细说.
回到之前的代码, subscribe(onNext:)
则表示我们要订阅一个 next 事件. 之前提到, just
函数会在发送一次事件之后立即结束, 这里我们也可以通过订阅来看到, 修改代码为如下代码, 以打印所有事件
Observable.just("Hello, world").subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
可以看到, 事件的顺序是next(Hello, world) => completed
disposeable
这个用于清理空间, 以及完成某些收尾工作.
在subscribe
后, 会返回一个disposeable
对象, 可以将这个对象放入某个 disposeBag
, 当这个disposeBag
对象被释放的时候, 会同时销毁所有与之关联的disposeable对象.
事件
RxSwift 中最重要的就是事件, 核心就是若干消息的消息链处理.
除了我们之前用到的just
之外, 还有一些其他方法可以产生多次事件, 例如of
Observable.of("Hello", "world").subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
这段代码的输出结果为
next(Hello)
next(world)
completed
RxSwift 中只有两种事件链, 一种是无尽的的, 也就是没有complete 事件. 一种则是有限长度的.
-1-2-3-4-|
这个是有限长度的事件链, 1, 2, 3, 4 是事件, |
是结束标记
-1-2-3-4-
这个则是无限的长度的事件链, 因为并没有结束符
-1-2-3-4-×
则表示发生了错误, ×
表示错误
需要注意的是, 只要了错误或者发送了结束事件, 那么后续所有的事件都会被忽略
创建自定义事件链
如果系统定义的事件链不能满足需要, 你需要自定义, 你可以 create 来办到这一点
例如, 我们来写一个跟 just 类似的, 只发送一个事件后就立即结束事件链
Observable<String>.create { (observer) -> Disposable in
observer.onNext("Hello, world")
observer.onCompleted()
return Disposables.create {}
}.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
这里, 你可以更细致的看到整个事件的全过程. 其中<String>
表示事件的元素类型.
一共步骤就只有4步, 创建, 发送事件, 发送结束标记, 处理 dispose
你可能会对 create 里面的observer
感到困惑, 为何这里的是观察者, 明明创建的是一个可观察对象? 你只需要明白, 可观察者在获取到事件后, 他并不是自己处理, 而是将这个事件传递给观察者.
当你了解到这点之后, 你也许灵光一闪, 想到可以用来处理网络事件
Observable<String?>.create { (observer) -> Disposable in
let task = URLSession.shared.dataTask(with: URL(string: "https://httpbin.org/get")!, completionHandler: { (data, _, error) in
if error != nil {
observer.onError(error!)
} else {
if data == nil {
observer.onNext(nil)
} else {
observer.onNext(String(data: data!, encoding: .utf8))
}
observer.onCompleted()
}
})
task.resume()
return Disposables.create {
task.cancel()
}
}.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
看到了吗, 就这么简单. 你甚至可以通过使用 map 来改变事件内容
例如
...与上面代码一样
.map{ $0 ?? "empty result" }
.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
你看到这里, 就表示你已经基本上入门了, 接下来, 你将会学习很多的操作符.
网友评论