在前面几篇博客中咱们详细的聊了ReactiveSwift中的Bag、Event、Observer以及Signal的使用方式和代码实现。那么在接下来的这几篇博客中,咱们就依附于以前博客的基础上来聊一聊SignalProducer的用法以及内部的代码实现。从SignalProducer的名字中,咱们容易知道,SignalProducer是信号量的生产者,确切的说,SignalProducer基于Signal的又一层封装。扩充了Signal的使用方式,使其更贴近于一些业务场景,好比网络的请求等。git
接下来咱们看一下SignalProducer的基本实现,也就是看一下SignalProducer一些核心的构造器和核心的方法。而且给出这些构造器以及核心方法的代码解释并给出其对应的使用方式。github
1、SignalProducer的核心属性、方法和构造器数组
开门见山,在本篇博客的第一部分咱们先给出SignalProducer结构体的核心属性、构造器和方法。下方会对这些SignalProducer的核心内容进行介绍,而后再看一下其具体的使用和运行方式。之因此说本部分所介绍的内容是SignalProducer的核心,由于SignalProducer的其余方法、构造器是在下方所要介绍的内容的基础上所创建起来的。网络
一、startHandler属性、init(startHandler)构造器以及startWithSignal()的方法实现闭包
startHandler属性是SignalProducer结构体的基本实现中的惟一属性。从下方代码片断中咱们能够看出startHandler的类型是一个闭包类型。该闭包类型的的参数是Observer和Disposable类型的对象,返回值为空。并发
而紧接着下方的init(startHandler)构造器就是为startHandler属性赋值的。虽然该init(startHandler)构造方法简单,可是是SignalProducer结构体的核心,由于在SignalProducer其余构造器中直接或者间接调用了下方的构造方法,稍后咱们会给出相应的代码实现。 框架
上述代码片断中的startWithSignal(setup)方法,也是SignalProducer结构体中比较核心的方法。由于在SignalProducer结构体的扩展方法中直接或者间接的调用了该方法。该方法中作的事情比较单一,就是调用Signal的pipe()方法建立了一个signal对象与该对象所对应的observer对象。该方法的参数是一个名为setup的闭包,将建立的signal对象交给setup()闭包,将observer对象交给startHandler()闭包。而startHandler的闭包体就是init(startHandler)构造器的尾随闭包。spa
二、上述属性和方法的使用server
上述的属性和方法之因此是SignalProducer结构体的核心,是由于SignalProducer的其余构造器以及扩展方法都是在此基数上构建起来的,稍后咱们会介绍到。如今咱们来看一下上述方法的调用方式。下方就是咱们给出的针对上述方法的示例和输出结果。对象
首先调用了SignalProducer的 init(startHandler)构造器,建立了一个producer常量。在该构造器的尾随闭包中,咱们能够经过闭包回调的形式获取到producer中signal对象所对应的observer,咱们能够经过该对象发送一些值,以下所示。
而后咱们建立了一个Observer类的 subscribe1对象,并给出了该观察者的Value事件的处理闭包。
最后咱们调用 startWithSignal启动producer的信号量,经过 startWithSignal()方法的尾随闭包,咱们能够获取到producer中的signal对象,而后将咱们建立的subscriber观察者与该signal进行关联。关联后,subscriber或收到producer中的observer对象所发送的Value事件。
最下方就是该段代码的运行结果,以下所示。
2、SignalProducer中的其余构造器
上面咱们聊了SignalProducer的核心构造器,在SignalProducer结构体的构造器阵营中,其构造器都是在上述核心构造器的基础上衍生出来的快捷构造器。这些衍生出来的构造器适用于特定场景下的SignalProducer的初始化,其功能更为专注,使用更为便捷。接下来咱们就来介绍一下这些衍生构造器的代码实现以及使用方式。
一、init(signal)和init(value)
下方代码片断就是init(signal)和init(value)的具体实现,从下方代码片断中咱们容易看出,最终都是调用的上述咱们介绍的init(startHandler)这个构造器。只不过在startHandler这个闭包块中所作的事情不一样罢了。
咱们先来看init(signal),该构造器接收一个signal信号量,而后将producer中的observer对象添加为该参数signal信号量的观察者,也就是说当这个信号量发送消息是,producer中的observer会收到这个外部信号量发过来的消息,而后通知producer中内部的信号量的全部观察者。针对上述代码实现咱们能够画出下方的简图。左边的mySignal就是经过init(signal)构造器传过来的信号量对象,mySignal信号量中的Bag中存储了一些该信号量的观察者。而后调用SignalProducer的init(signal)方法将mySignal信号量传给SignalProducer,而后将SignalProducer中的内部信号量signal所对应的observe添加到mySignal的Bag中,使其成为mySignal信号量的观察者。具体以下所示,稍后咱们会给出具体使用方式。
上述init(value)构造器就简单的多了,就是在调用init(startHandler)构造器的尾随闭包中调用SignalProducer内部的observer将init(value)提供的参数发送出去。发送完毕后就调用Observer的sendCompleted()方法,完成信号量的发送。
接下来咱们来看一下上述两个构造器的使用示例以及示例的运行结果。
首先咱们来看一下 init(signal)的使用示例。首先建立了一个mySignal信号量以及该信号所对应的myObserver。而后调用init(signal)构造器,并把mySignal对象传给该构造器。接着经过startWithSignal()方法往producer中的signal中添加一个名为subscriber1观察者。而后调用myObserver发送Value信号量,咱们能看到,producer中信号量的观察者subscriber1也能收到该信号量。
而 init(value)构造器的使用就简单许多,直接在SignalProducer建立时,将SignalProducer所对应的信号量所须要发送的值传进去便可,以下所示。
二、init(action)、init(error)以及init(result)构造器
接下来咱们再来看一下这init(action)、init(error)以及init(result)三个构造器,这个三个构造器也是直接或者间接的调用了咱们以前的核心构造器init(startHandler)。下方就是这三个构造器的具体代码实现:
init(action)构造器接收了一个名为action的无参闭包,该闭包的返回值为Value。从其代码实现咱们不难看出,下方代码就等同于 self.init(value: action())。action闭包的做用就是为 observer.send(value)提供值的。
init(error)构造器中就是在调用 init(startHandler)时,在其尾随闭包中的获取到observer而后调用 send(error)方法,发送Failure事件。
init(result)构造器接收的是一个 Result枚举对象,目的就是将Result枚举中的 success转换成 Value事件,将failure结果转换成failure事件并发送相应的Error。
由于该三个构造方法比较简单,就不提供相应的使用示例了,若是你感兴趣,能够在官方提供的Playground中进行示例的编写。
三、init(values)和init(first, second, tail…)构造器
本小节咱们就来聊一下init(values)和init(first, second, tail)这两个构造器,这两个构造器的功能其实差很少,实现方式也是相同的,只不过是调用方式不一样。下方是这两个构造器具体的代码实现。
init(values)构造器接收的是一个可遍历的序列,在具体的代码实现中,咱们遍历该序列,取出其中的每一个值,而后调用 observer的send(value)方法将该值进行发送。遍历完成后,调用了 sendCompleted()方法完成信号量的发送。
init(first, second, tail ...)构造器是一个不定参构造器。在该构造器中,咱们将收到的参数组合成数组,而后调用init(values)构造器,具体实现以下。
针对上述的构造器,咱们给出了下方这两个使用示例,以及相应示例的输出结果。
今天的博客就先到这儿,下篇博客咱们会继续解析ReactiveSwift框架中的其余内容。
上述代码github分享地址:https://github.com/lizelu/TipSwiftForRac 。