RACCommand通常会和UI相关动作绑定在一起, 例如UIButton.
几个关键属性:
- enabledSignal: 初始化的时候传入的一个信号, 可以控制该command是否能被执行.
- sourceSignal:在初始化的时候signalBlock里面我们返回的信号, 里面包含着button被按下所要执行的代码;
- executionSignals: 一个RACSignal, 当execute成功调用时, 会send sourceSignal. 需要注意的是, 这个signal只会发送next, 不会发送error. 如果想捕获error事件, 需要用下面的errors属性.
- executing: 一个RACSignal, 当execute成功调用时, 会send YES, 调用结束时, 会send NO.
- enabled: 一个RACSignal, 发送NO: 当enabledSignal发送NO时, 或者当allowsConcurrentExecution为NO且command开始run了; 发送YES: 当NO的状态不再满足时.
- allowsConcurrentExecution: BOOL. 是否允许多个comman同时run. 如果设置为yes的话, 那么UIButton在command结束run之前就不会被一直禁掉, 且会fire多次任务.
- errors. 一个RACSignal. 会转发execute方法里所有出现的错误.
例如当按钮按下的时候, 那么就会开始执行execute方法. 当然, execute也可以手动强制执行.
- 首先要看exectue是否能够被调用, 这里的判断条件由enabledSignal信号决定, 同时也会由executing信号决定(当前有任务正在进行).
- 如果调用失败, 会发送error信号, 并终止调用
- 把sourceSignal取出来, 将其multicast成RACReplaySubject(转成冷信号), 然后进行connect. 最后对转换出来的cold signal进行订阅. 从这里开始, sourceSignal里面的代码就开始运行了, 比如开始网络请求之类的. (因为有订阅出现了)
- executionSignals会将sourceSignal发送出来, executing发送YES, 相应的enabled之类的也会发送对应的值
- 一直等待sourceSignal发送complete. 一旦发送了, 那么这时才算一个command执行完成. 然后executionSignals, exectuing之类的也会重新发送当前的状态值.