Observable可以用来描述元素异步产生的序列。对于Observable而言,所有的事物都是序列。
如果我们已经可以把生活中的许多事物看作是一个序列了。那么我们要怎么创建这些序列呢? 实际上,框架已经帮我们创建好了许多常用的序列。例如:button的点击、textField的当前文本、switch的开关状态、slider的当前数值等等。
另外,有一些自定义的序列是需要我们自己创建的。这里介绍一下创建序列最基本的方法,例如,我们创建一个 [0, 1, ... 8, 9]的序列
let numbers: Observable<Int> = Observable.create { (observer) -> Disposable in observer.onNext(0) observer.onNext(1) observer.onNext(2) observer.onNext(3) observer.onNext(4) observer.onNext(5) observer.onNext(6) observer.onNext(7) observer.onNext(8) observer.onNext(9) observer.onCompleted() return Disposables.create() }
创建序列最直接的方法就是调用 Observable.create,然后再构建函数里面描述元素的产生过程。observer.onNext(0) 就代表产生了一个元素,他的值是0,后面又产生了9个元素分别是 1,2,... 8,9.最后,用 observer.onCompleted() 表示元素已经全部产生,没有更多元素了。你可以用这种方式来封装功能组件
typealias JSON = Any let json: Observable<JSON> = Observable.create { (observe) -> Disposable in let task = URLSession.shared.dataTask(with: URLRequest(url: URL(string: "https://www.baidu.com")! )) { (data, _, error) in guard error == nil else { observe.onError(error!) return } guard let data = data, let jsonObject = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) else { return } } task.resume() return Disposables.create { task.cancel() } }
在闭包回调中,如果任务失败,就调用observer.onError(error!)。如果获取到目标元素,就调用observer.onNext(jsonObject),由于我们的这个序列只有一个元素,所以在成功获取元素后,就直接调用observer.onCompleted() 来表示任务结束。最后 Disposables.create { task.cancel() } 说明如果数据绑定被清除(订阅被取消)的话,就取消网络请求。
这样一来我们就将传统的闭包回调转换成序列了,然后可以用 subscribe 方法来响应这个请求的结果:
json.subscribe { (json) in print("取得 json 成功:\(json)") } onError: { (error) in print("取得 json 失败 Error: \(error.localizedDescription)") } onCompleted: { print("取得 json 任务成功") }.disposed(by: disposeBag)
这里 subscribe 后面的 onNext、onError、onCompleted 分别响应我们创建json时,构建函数里面的 onNext、onError、onCompleted事件。我们称这些事件为 Event:
你可以合理的利用这些 Event 来实现业务逻辑。
现在我们知道如何用最基本的方法创建序列。你还可以参考决策树来选择其他的方式创建序列。
参考网址: RXSwift中文网
原文:https://www.cnblogs.com/muzichenyu/p/14838882.html