专栏首页吴老师移动开发【iOS开发】RxSwift入门:从Observable.create讲起

【iOS开发】RxSwift入门:从Observable.create讲起

刚学习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封装网络请求

如果文章对您有帮助,就关注一下点个赞吧,我会持续写一些实际开发中遇到的问题,代码写法相关的文章。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Linux,Mac或Windows上安装Git

    Git是由Linus Torvalds为Linux内核设计开发的。Git为非线性的分布式开发提供了支持,允许多个项目成员同时在一个项目上进行开发。Git是最流行...

    Techeek
  • 【iOS开发】RxSwift中的Subject(PublishSubject/BehaviorSubject/ReplaySubject/Variable)

    PublishSubject 即是一个被观察者(Observable)也是一个观察者 (Observer)

    吴老师
  • 【iOS开发】Cocoapods详解-使用及创建私有库

    CocoaPods现在是通过target来组织的,如果项目有多个target,可以写多个target为每个target引入不同的第三方库。 写法:

    吴老师
  • 【iOS开发】iOS 动画详解

    在移动开发中,为了提高用户体验,会用到一些动画来提高应用的视觉效果。让人有眼前一亮的感觉。同时有动画的过渡过程,会让应用看起来不是那么的生硬,更吸引用户。

    吴老师
  • 【iOS开发】UITableView优化

    移动开发中,任何一个应用都或多或少的有列表的存在,列表的上下滑动直接关系到用户体验。如果处理不好,就会使得列表滑动起来有明显的卡顿效果。所以对列表的优化,让它更...

    吴老师
  • 【iOS开发】浅谈iOS列表分页数据管理

    @property (nonatomic, copy) NSMutableArray *list; @property (nonatomic) NSInteg...

    吴老师
  • 【iOS开发】UITableView和UICollectionView多种类型cell处理,更好地组织代码

    开发不仅仅是完成功能,还要写出认后来人可以很容易上手维护的代码。今天就记录一下列表数据,多种类型cell时,如何更好的组织代码。从实际需求场景出发,先看一下UI...

    吴老师
  • 【iOS开发】启动时间优化,runloop的一个小技术点

    刚接触项目不久,最近产品说有一个点要优化,App的启动页面显示时间太长了。一直在开发其它的app,还真没注意这个点,去看了一下还真是,有的时候启动页面的显示时间...

    吴老师
  • 【iOS开发】一些不错的文章博客整理

    吴老师

扫码关注云+社区

领取腾讯云代金券