RACSignal使用步骤:
1.创建信号 + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe
2.订阅信号,才会激活信号.
-(RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
3.发送信号 - (void)sendNext:(id)value
4.发送完成
首先是创建信号:
RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { }
createSignal方法:
<pre>+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe { return [RACDynamicSignal createSignal:didSubscribe]; }
</pre>创建信号的实质是创建一个RACDyamicSignal
类型的对象.
接下来走到这个方法:
<pre>+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe { RACDynamicSignal *signal = [[self alloc] init]; signal->_didSubscribe = [didSubscribe copy]; return [signal setNameWithFormat:@"+createSignal:"]; }
</pre>
把didSubscribe
保存在信号里面,目前只是单纯的保存.
<h4>订阅信号</h4>
<pre>[signal subscribeNext:^(id x) { }];
</pre>
当信号被订阅,也就是调用signal的subscribeNext:nextBlock subscribeNext内部会创建订阅者subscriber
<pre>`- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}</pre> 这一方法的目的是把nextBlock保存到subscriber中。 <pre>
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
NSCParameterAssert(subscriber != nil);
RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];
if (self.didSubscribe != NULL) {
RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
RACDisposable *innerDisposable = self.didSubscribe(subscriber);
[disposable addDisposable:innerDisposable];
}];
[disposable addDisposable:schedulingDisposable];
}
return disposable;
}`</pre>
<h4>3.发送信号</h4>
执行didSubscibe回到创建信号的方法的block
<pre>`RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"发送消息"];
}`</pre>
发送消息:sendNext底层其实就是执行subscriber的nextBlock,把value值传递给[siganl subscribeNext:^(id x) { }];
的block中接收消息
<pre>`- (void)sendNext:(id)value {
@synchronized (self) {
void (^nextBlock)(id) = [self.next copy];
if (nextBlock == nil) return;
nextBlock(value);
}
}`</pre>
4.接收完消息之后信号的销毁问题
信号的销毁是由RACDisposable类负责的.在[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { }
方法的return中自动调用 等同于 [subscriber sendCompleted];
方法
<pre>`return [RACDisposable disposableWithBlock:^{
// block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
// 执行完Block后,当前信号就不在被订阅了。
NSLog(@"信号被销毁");
}];
`</pre>
核心方法如下
<pre>`- (void)dispose {
void (^disposeBlock)(void) = NULL;
while (YES) {
void *blockPtr = _disposeBlock;
if (OSAtomicCompareAndSwapPtrBarrier(blockPtr, NULL, &_disposeBlock)) {
if (blockPtr != (__bridge void *)self) {
disposeBlock = CFBridgingRelease(blockPtr);
}
break;
}
}
if (disposeBlock != nil) disposeBlock();
}
`</pre>
5.如果想持续保持一个信号不被销毁 可以强引用这个信号@property (nonatomic, strong)id<RACSubscriber> subscriber;
在需要销毁的时候调用[disposable dispose];