【iOS开发】RxSwift入门:从Observable.cre
刚学习RxSwift的时候,到github看文档,搜索别人的博客。基本上都是从那些例子讲起,像下面这样,自己再跟着用playground写一篇。
example("of") {
let one = 1
let two = 2
let three = 3
let observable = Observable.of(one, two, three)
observable.subscribe({ (event) in
if let element = event.element {
print(element)
}
})
observable.subscribe(onNext: { (element) in
print(element)
})
}
通过这样的方式,可以了解RxSwift的用法。但是,有时候,如果能先讲明白原理,再去写代码,写例子,知道自己在写什么,知道它的运行原理,可能会更快的学会它的运用。
先看一下Event的定义:
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
}
分析一下这个Event枚举:接收一个泛型元素,有三个成员,next,error,completed。再说一下它跟Observable的关系,Observable发送的所有事件都是一个Event,同一个Observable发送的Event的泛型参数的类型肯定是一样的,就是说一个Observable不会即发送String又发送Int。像just
empty
等都是Observable的子类,就是内部封装好了泛型Element类型的特定Observable。
下面来看一下Observalbe.create:
let someObservable = Observable<Bool>.create({ (observer) -> Disposable in
observer.onNext(true);
observer.onCompleted()
return Disposables.create()
});
咋一看好像没什么用,Observer的next事件都写好了,但是这个Observable是可以异步的。就是说这个闭包里面是可以执行异步代码的。以一个读取商品信息的网络请求为例,可以这样写:
let someObservable = Observable<GoodsModel>.create({ (observer) -> Disposable in
GoodsApi.request() {
if (请求成功) {
observer.onNext(解析好的GoodsModel)
}
else {
observer.onError(error)
}
observer.onCompleted()
}
return Disposables.create()
});
创建这个Observable再订阅,那么你就可以通过异步的方式获取网络返回的结果了。这跟OC时代用RACCommand做网络请求封装比较相似。将上面的Observable做为一个方法的返回值,放到ViewModel里面。在Controller里面调用方法,再订阅,流程就比较清晰了。
不知道这样讲,相对于一开始就看那些例子有没有更清晰一点。
要记得一点:Observable发送的所有事件都是一个Event对象,即我们订阅一个Observable收到的任何事件都是一个Event
想看RACCommand写法的同学可以去看一下我的另一篇文章: MVVM中使用RACCommand封装网络请求
如果文章对您有帮助,就关注一下点个赞吧,我会持续写一些实际开发中遇到的问题,代码写法相关的文章。