我们都知道 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 源码分析