我们都知道 RxSwift 是 Swift 语言 Reactive Extension 标准的实现。RxSwift 有很多操作符,使用简单且功能强大,而其源码实现也非常具有学习和参考的价值。那么今天我们先研究一下 Observable 创建的操作符之一 —— Create
。
为什么要研究 Create 操作符的源码,因为其他很多操作符都是基于 Create 操作符实现的,所以只要我们把 Create 的操作符的实现原理了解透彻之后,其他基于 Create 实现的操作符理解就很简单了。为了便于理解和加深记忆,在分析 Create
操作符源码之前,我们先了解下 Rx 中的一些概念和设计模式。
一、推模式和拉模式 如何理解推「Push」模式
和拉「Pull」模式
?举个简单的例子:以客户端和服务器为例,客户端向服务器所要数据,有两种方式,一种是客户端询问服务器是否有数据,如果有数据则向服务器发送请求然后获取数据,这种方式称为拉模式
,可以用迭代器模式
来实现,比如轮训。另一种方式则是客服端跟服务器建立一个通道或者说建立一种关系,当服务器有新的数据时,立即先客户端推送新的数据,这种方式称为推模式
,可以用观察者模式
或者订阅/发布模式
来实现,比如长连接。
1. 迭代器模式 迭代器模式
是一种行为设计模式,能让你在不暴露集合底层表现形式「列表、 栈和树等」的情况下遍历集合中所有的元素。 这样看来迭代器和 for
、for-each
、while
和 do-while
并没有区别,某种程度上来讲或者说在 Swift 语言中他们确实没有区别,但是在其他语言中,比如 Java
数据结构就有 ArrayList
和 LinkedList
,ArrayList 内部是动态数组实现的,是顺序结构,可以通过下标
访问元素,使用 for 循坏可以快速遍历元素,而 LinkedList 内部是链表实现的,是无序结构,无法使用下标
访问元素,那么使用迭代器遍历元素就是一种不错的选择。
下面开始迭代器的具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 protocol Iterable { associatedtype Element var count: Int { get } var isEmpty: Bool { get } var hasNext: Bool { get } func append (_ element : Element ) func remove (at index : Int ) -> Element func element (at index : Int ) -> Element func next () -> Element ? } protocol CollectionIterable { associatedtype Element func makeInterator () -> ListIterator <Element > } class ListIterator <Element >: Iterable { private var elements: [Element ] private var currentIndex = 0 init (_ elements : [Element ]) { self .elements = elements } var count: Int { return elements.count } var isEmpty: Bool { return count == 0 } var hasNext: Bool { return ! isEmpty && currentIndex < count } func append (_ element : Element ) { elements.append(element) } func remove (at index : Int ) -> Element { elements.remove(at: index) } func element (at index : Int ) -> Element { return elements[index] } func next () -> Element ? { if hasNext { defer { currentIndex += 1 } return elements[currentIndex] } return nil } } extension Array : CollectionIterable { func makeInterator () -> ListIterator <Element > { return ListIterator (self ) } }
接下来可以简单测试下代码
1 2 3 4 5 6 7 8 9 10 let it = [1 , 2 , 3 , 4 ].makeInterator()print ("count: \(it.count) " )it.remove(at: 0 ) it.remove(at: 1 ) print ("count: \(it.count) " )it.append(3 ) print ("count: \(it.count) " )while it.hasNext { print ("next: \(it.next() ?? - 1 ) " ) }
输出:
1 2 3 4 5 6 count: 4 count: 2 count: 3 next: 2 next: 4 next: 3
2. 观察者模式 和 订阅/发布模式 二、观察者模式和订阅/发布代码实现 三、手动实现 Create
操作符 四、RxSwift Create
源码分析