面向协议编程/响应式编程

833 阅读2分钟

面向协议编程

  • 是 Swift 的一种编程范式,Apple 于2015年WWDC提出
  • 在 Swift 的标准库中,能见到大量 POP 的影子
  • 同时,Swift 也是一种面向对象的编程语言
  • 在 Swift 开发中,OOP 和 POP 是相辅相成的,任何一方并不能取代另一方
  • POP 能弥补 OOP 一些设计上的不足

回顾 OOP

  • OOP 的三大特性:继承、封装、多态
  • 继承的经典使用场合
  • 当多个类具有很多共性时,可心将这些共性抽取到一个父类中

OOP 的不足

但有些问题,使用 OOP 并不能很好解决

  • 如何将 BVC、DVC的公共方法 run 抽取出来
class BVC: UIViewController {
    func run() {
        print("run")
    }
}
class DVC: UIViewController {
    func run() {
        print("run")
    }
}
  • 基于OOP想到的一种解决方案
  1. 将 run 方法放到另一个对象 A 中,然后 BVC、DVC拥有对象 A 属性
    • 多了一些额外的依赖关系
  2. 将 run 方法增加到 UIViewController 分类中
    • UIViewController 会起来越臃肿,而且会影响它的其他所有子类
  3. 将 run 方法抽取到新的父类,采用多继承?
    • OC 中利用消息转发也可以办到
    • 会增加程序设计的复杂度,产生菱形继承问题,需要开发者额外解决

POP的注意点

  • 优先考虑创建协议,而不是父类
  • 优先考虑值类型,而不是引用类型
  • 巧用协议的扩展功能
  • 不要为了面向协议而使用协议

利用协议实现前缀效果

利用协议实现类型判断

响应式编程

  • 也是一种编程范式,于1997年提出,可以简化异步编程,提供更优雅的数据绑定
  • 一般与函数式融合在一起,所以也会叫做:函数响应式编程
  • 比较出名的框架
    • ReactiveCocoa
      • 简称 RAC,有 OC、Swift 版本
    • ReactiveX
      • 简称 Rx,有众多编程语言的版本,比如 RxSwift 等等

RxSwift

pod 'RxSwift', '~> 5'
pod 'RxCocoa', '~> 5'

RxSwift 的核心角色

  • Observable: 负责发送事件(Event)
  • Observer: 负责订阅 Observable,监听 Observable 发送的事件(Event)
  • Event 有3种
    • next: 携带具体数据
    • error: 携带错误信息,表明 Observable 终止,不会再发出事件
    • completed: 表明 Observable 终止,不会再发出事件

创建、订阅 Observable

  • Observable.just
  • Observable.of
  • Observable.create
  • Observable.from
  • Observable.timer
  • ......

Disposable

  • 每当 Observable 被订阅时,都会返回一个 Disposable 实例,当调用 Disposable 的 dispose,就相当于取消订阅
  • 在不需要再接收事件时,建议取消订阅,释放资源,有3种常见的方式
    • 一次性订阅: dispose()
    • 当 bag 销毁时,会处动调用 Disposable 实例的 dispose: disposed(by: bag)
    • self 销毁时,会自动调用 Disaposable 实例的 dispose

创建 Observer

  • 可以通过 create
  • 也可以通过 Binder
let binder = Binder<String>(label) { label, text in
    label.text = text
}