为什么使用RxSwift?

我们编写的代码绝大多数都涉及对外部事件的响应。当用户点击操作时,我们需要编写一个@IBAction事件来响应。我们需要观察通知,以检测键盘何时改变位置。当网络请求响应数据时,我们必须提供闭包来执行。我们使用KVO来检测变量的变化。所有这些不同的系统使我们的代码增加了不必要地复杂。如果有一个一致的系统来处理我们的所有的调用/响应代码,难道不是更好吗?Rx就是这样一个系统。

RxSwift是用于大多数主要语言和平台的响应扩展(即Rx)的正式实现。

概念

每一个Observable的实例都是一个序列

Observable序列相比于Swift序列的关键优势点在于它能够异步地接收元素。这是RxSwift精髓所在,其他的一切都扩展了这个概念。

  • Observable(ObservableType)等效于Sequence
  • observableType.subscribe(_:)方法等效于Sequence.makeIterator()
  • ObservableType.subscribe(_:)接收一个观察者ObserverType参数,它将被订阅自动接收由可观察到的序列事件和元素,而不是在返回的生成器上手动调用next()

如果一个Observable发出一个next事件(Event.next(Element)),它还能够继续发出更多的事件。但是,如果一个Observable发出一个error事件(Event.error(ErrorType))或者一个completed事件(Event.completed),那么这个Observable序列就不能给订阅者发送其他的事件了。

Observables and Observers(又名subscribers -- 订阅者)

除非有订阅者,否则Observable不会执行它们的闭包。
在下面的例子中,Observable的闭包将不会被执行,因为没有订阅者订阅。

_ = Observable<String>.create({ (observingString) -> Disposable inprint("the code will not be executed")observingString.onNext("?")observingString.onCompleted()return Disposables.create()})

在下面的例子中,Observable的闭包将会被执行,因为有订阅者订阅。

_ = Observable<String>.create({ (observingString) -> Disposable inprint("the code will be executed")observingString.onNext("?")observingString.onCompleted()return Disposables.create()}).subscribe({ (event) inprint(event)})

我们现在不必担心上面例子中的Observable是怎样被创建出来,我会和大家一步一步深入学习。

subscribe(_:)返回一个一次性的实例,该实例表示一个可使用的资源,如订阅。在前面的简单示例中,它被忽略了,但是应该正常地处理它。这通常意味着将它添加到一个DisposeBag实例中。

Creating and Subscribing to Observables

有几种方式创建和订阅Observables:

  • never
    创建一个永不终止且不发出任何事件的序列。更多详情

    let disposeBag = DisposeBag()
    Observable<String>.never().subscribe({ (_) inprint("this will never be printed")
    }).disposed(by: disposeBag)
  • empty
    创建一个只发送completed事件的空Observable序列。更多详情

    let disposeBag = DisposeBag()
    Observable<Int>.empty().subscribe({ (event) inprint(event)
    }).disposed(by: disposeBag)
  • just
    创建一个只有一个元素的Observable序列。更多详情

    let disposeBag = DisposeBag()
    Observable.just("单一元素").subscribe({ (event) inprint(event)
    }).disposed(by: disposeBag)
  • of
    创建一个固定数量元素的Observable序列。

    let disposeBag = DisposeBag()
    Observable.of("元素1","元素2","元素3","元素4","元素5").subscribe(onNext: { (element) inprint(element)
    }).disposed(by: disposeBag)

    注意:此处用到了subscribe(onNext:)的便利构造方法,有部分参数使用的是默认值。

  • from
    从一个序列(如Array/Dictionary/Set)中创建一个Observable序列。

    let disposeBag = DisposeBag()
    Observable.from(["元素1","元素2","元素3","元素4","元素5"]).subscribe(onNext: {print($0)
    }).disposed(by: disposeBag)

    注意:这个例子使用了默认参数$0而不是显式地命名参数。

  • create
    创建一个自定义的Observable序列。更多详情

    let disposeBag = DisposeBag()
    let myjust = { (element: String) -> Observable<String> inreturn Observable.create{ observer inobserver.on(.next(element))observer.on(.completed)return Disposables.create()}
    }myjust("篮球").subscribe({ (element) inprint(element)
    }).disposed(by: disposeBag)
    
  • range
    创建一个Observable序列,它会发出一系列连续的整数,然后终止。更多详情

    let disposeBag = DisposeBag()
    Observable.range(start: 1, count: 10).subscribe { print($0) }.disposed(by: disposeBag)
  • repeatElement
    创建一个Observable序列,它可以无限地释放给定元素。更多详情

    let disposeBag = DisposeBag()
    Observable.repeatElement("?").take(3).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

    上述例子中take操作符从一个序列开始返回指定数量的元素。

  • generate
    创建一个Observable序列,只要提供的条件值为true就可以生成值。

    let disposeBag = DisposeBag()
    Observable.generate(initialState: 0, condition: {$0 < 3}, iterate: {$0 + 1}).subscribe(onNext: {print($0)}).disposed(by: disposeBag)
  • deferred
    为每一个订阅者创建一个新的Observable序列。更多详情

    let disposeBag = DisposeBag()
    var count = 1
    let defferedSequen = Observable<String>.deferred {print("count = \(count)")count += 1return Observable.create({ (observer) -> Disposable inobserver.onNext("山羊")observer.onNext("野猪")observer.onNext("小猫")return Disposables.create()})
    }defferedSequen.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
    defferedSequen.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
  • error
    创建一个不会发送任何条目并且立即终止错误的Observable序列。

    let disposeBag = DisposeBag()
    Observable<Int>.error(TestError.test).subscribe { print($0) }.disposed(by: disposeBag)
  • do
    为每个发出的事件调用一个副作用操作,并返回(通过)原始事件。更多详情

    let disposeBag = DisposeBag()
    Observable.of(["元素1","元素2","元素3"]).do(onNext: {print("next:\($0)")}, onError: {print("error:\($0)")}, onCompleted: { print("completed")
    }).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

致谢

若发现有错误的地方,欢迎各位评论,感谢!同时也希望能够帮助到有需要的同学。

转载于:https://www.cnblogs.com/yujihaia/p/7425849.html

RxSwift 系列(一)相关推荐

  1. RxSwift系列—RxSwift高阶函数

    3.1 组合操作符 3.1.1 startWith 在开始从可观察源发出元素之前,发出指定的元素序列 print("*****startWith*****") Observable ...

  2. RxSwift系列—RxSwift调度者

    四.RxSwift调度者 4.1 案例引入 Schedulers 是RxSwift实现多线程的核心模块.它主要用于控制任务在哪个线程或队列运行. 咱们在平时的开发过程中,肯定都使用过网络请求,网络请求 ...

  3. RxSwift系列—Driver

    五.Driver 5.1 案例引入 请求一次网络,绑定到UI上 5.1.1 采用Observerable let result0 = inputTF.rx.text.skip(1).flatMap { ...

  4. 【RxSwift 实践系列 2/3】thinking in Rx- Create和Drive

    ---> 上节 [RxSwift 实践系列 1/3]为什么使用RxSwift RxSwift 是一种编程思想,不是一门语言,学习他最难的部分就是thinking in Reactive Prog ...

  5. 干货集中营 ReactiveCocoa+RXSwift+MVVM

    原文地址: 传送门简书只做同步更新功能 学习函数响应式编程已经接近两个月的时间.说实话坚持下来实在不易.两个月的时间看过近150篇博文,算下来啃下来一本千页的技术书籍也差不多.不过随着知识面的拓广,学 ...

  6. 理解 RxSwift:为什么要使用 RxSwift(一)

    理解 RxSwift:为什么要使用 RxSwift(一) 理解 RxSwift:实现原理(二) RxSwift 是一个可以帮助我们简化异步编程的框架,它是 ReactiveX(简写:Rx) 的 Swi ...

  7. 翻译:RxSwift的历史以及概念详细解析

    说明 RxSwift到底是什么?这是一个很好的定义: RxSwift是一个库,用于通过使用可观察的序列和功能样式运算符来组成基于异步和基于事件的代码,从而允许通过调度程序进行参数化执行. 听起来复杂吗 ...

  8. mojito: 麻烦给我的爱人来一份 RxSwift

    序 学过 Swift 的 同学都知道, RxSwift 宛如 周董的 mojito 开始微醺 再者上头 为什么要学习 RxSwift ? 卡蜜尔说过 优雅,永不过时 麻烦给我的爱人来一份 RxSwif ...

  9. 妙用postman系列——postman建组、分享

    妙用postman系列--postman建组.分享 添加新的组和请求. 3.生成分享链接 4.导入分享链接

最新文章

  1. 【linux】route使用小结
  2. linux内核使用scons构建,如何使用scons进行交叉构建
  3. 第五章--预处理理论
  4. 南大计算机考研录取,南京大学拟录取名单公示,初试最高446分,推免占比竟高达75%...
  5. ubuntu 的QT4的qmake失败的处理方法
  6. 【CTSC2010】珠宝商【后缀自动机】【点分治】【根号分治】
  7. python的read函数调用报错_从零开始学Python(七):文件存储I/O流和异常捕捉
  8. data structure最短路径问题
  9. MyEclipse安装包
  10. 求教一个WEBSERVER与C的通信问题
  11. 简述this,call,apply,bind之间的关系
  12. 计算机函数说课ppt,幂函数说课课件
  13. safri 对于display:block;的元素显示不出来 其他所有浏览器均正常
  14. t6UFO资产负债表
  15. 蓝桥杯python组一个星期备战记录贴
  16. 大数据就业:学完大数据怎样就业
  17. VOC2012数据集的探索性数据分析(EDA)
  18. 基于python的土壤细菌在kobas库的功能预测代码
  19. 第八篇:读《反脆弱》
  20. 小诀窍:不妨尝试从交付质量上打败对手

热门文章

  1. 基于单片机步进电机ppt答辩_基于MCU和DSP的步进电机控制技术分析
  2. php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序
  3. jedis watch Java_jedis操作redis的几种常见方式总结
  4. java 监听 变量_[Java学习小记]使用PropertyChangeSupport来监听变量的变化
  5. 8分钟答辩稿_5分钟学会8个答辩小套路,教资面试没在怕的啦!
  6. python docx库使用样例_Python docx库用法示例分析
  7. 从金蝶k3到金税盘_经典全套金蝶K3操作流程大全
  8. 工业以太网交换机与以太网光端机的区别
  9. 电视光端机应用范围及故障维护问题介绍
  10. 【渝粤题库】国家开放大学2021春2718动物生理基础题目