首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

RACSignal实现流程

2024-12-15 来源:华拓网

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];

显示全文