威立山

记录心路历程

0%

RxSwift实践

函数响应式编程FRP

  • FRP是基于异步事件流进行编程的一种编程范式。针对离散事件序列进行有效的封装,利用函数式编程的思想,满足响应式编程的需要。
  • ReactiveCocoa是Github在制作Github客户端时开源的一个副产物,缩写为RAC。它是Objective-C语言下FRP思想的一个优秀实例,后续版本也支持了Swift语言。
  • Swift语言的推出为iOS界的函数式编程爱好者迎来了曙光。著名的FRP开源库Rx系列也新增了RxSwift,保持其接口与ReactiveX.net、RxJava、RxJS接口保持一致。

RxSwift

  • 核心概念就是一个观察者(Observer)订阅一个可观察序列(Observable)。观察者对 Observable 发射的数据或数据序列作出响应。
  • 举个例子——你就是观察者,你正在统计某地方的交通情况。每通过一辆车,你就记一下车牌号和车的型号等等。这个时候这一辆辆车就是序列,你对经过的车进行记录就是对序列的响应。
  • 我们的应用也是这样。再看 Button 的点击这个情景。我们把用户一次又一次的点击 Button 看做是序列,通过调用 subscribe 来订阅这个点击事件,每次点击都会发射一个数据,作为订阅者的 subscribe 收到这个这个数据进行某些响应。
  • 序列存在三种情况:发射数据(Next)、遇到问题(Error)、发射完成(Completed)。

有限序列和无限序列

  • 有这样一个序列 –1–2–3–4–5–6–| ,它发送了按顺序发送了 1 2 3 4 5 6 这些值后,就终止了,就是发射完成。这是一个有限序列。

  • 也有可能因为某些特殊的情况,遇到某些错误(比如数据解析错误),–1–2–3–4–X ,因为解析错误意外终止。

  • 也有无限序列,比如用户点击 Button ,这个就属于无限序列:—tap-tap——-tap—> 当然这里的无限不是真的无限,是不确定用户什么时候会点击,不确定是否会继续点击。所以这是一个无限序列,每当用户点击,序列就发射一个值。

常用方法

  • never:创建一个不被终结,也不发送任何事件

  • empty:创建一个空序列,只发送一个completed事件

  • just:创建一个只有一个元素的序列

  • of:创建一个包括若干元素的序列

  • map :就是用你指定的方法去变换每一个值,这里非常类似 Swift 中的 map
    map

  • flatMap:投射一个源序列的每个元素到一个新的序列,并平整的合并成一个target序列。对新序列发送新值会添加到目标序列(flatMap会和每个创建的新序列保持联系)

    flatMap

  • flatMapLatest:只接受最后的序列,不订阅之前的新序列
    flatMapLatest

#RxCocoa

  • RxCocoa是一个独立的库(虽然和RxSwift打包一起使用),可以在iOS,MacOS,AppleTV等平台使用。它对UIKit和Cocoa的控件进行了封装,提供更加丰富的功能。

  • 例如:UILabel,UITextField等

相关知识

  • 绑定(苹果不公开他们的绑定系统(Cocoa Bindings),mac上的绑定非常的先进,并且和苹果提供的类耦合)
  • 在RxCocoa提供更加简单的方法,仅仅依赖库中的几个类型。简单的理解绑定是单向的数据流,简化了在应用内的数据流
  • 最基本的方法bindTo(_:)绑定一个序列到另一个元素,接受者必须遵循ObserverType
  • Subjects 是极其重要,主要作用:和UI控件一起工作的时候(UILabel设置新值,取值)
  • 可以理解 bindTo(_:)是 subscribe()的一个定制版本
  • flatMapLatest:好处是在Rx中可观察序列是可以重复使用的实体,正确的建模,可以使一个漫长,难以阅读的一次性观察者,变成一个多用途的且易于理解的观察者。
  • 可以用不同的subcription处理单个参数,映射要显示的值