ReactiveCocoa 使用.RACSubject类使用

2017-08-31  本文已影响0人  土豆萝卜君

我们知道只要创建一个信号,在有一个订阅者去订阅她我们就可以发送消息了。但是有没有一个对象既可以发送消息又可以订阅消息呢? 这时候RACSubject 就出现了,因为它继承与RACSignal信号类又遵守RACSubscribe协议这样达到了就既能发送,又能订阅信号的操作了。他的使用场景可以做为代理来使用 或者 用来绑定ViewModel和View

RACSubject
- (void)subjectTest {
    
    RACSubject *subject = [RACSubject subject];
    // 2.订阅信号(这里可以创建多个订阅者)
    [subject subscribeNext:^(id x) {
        // block调用时刻:当信号发出新值,就会调用.
        NSLog(@"第一个订阅者%@",x);
    }];
    [subject subscribeNext:^(id x) {
        // block调用时刻:当信号发出新值,就会调用.
        NSLog(@"第二个订阅者%@",x);
    }];
    [subject subscribeNext:^(id x) {
        // block调用时刻:当信号发出新值,就会调用.
        NSLog(@"第三个订阅者%@",x);
    }];
    // 3.发送信号
    [subject sendNext:@"1"];
}
RACReplaySubject
- (void)replaySubjectTest{
RACReplaySubject *replaySubject = [RACReplaySubject subject];
    
    // 2.发送信号
    [replaySubject sendNext:@1];
    [replaySubject sendNext:@2];
    
    // 3.订阅信号
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第一个订阅者接收到的数据%@",x);
    }];
    
    // 订阅信号
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第二个订阅者接收到的数据%@",x);
    }];
}

上一篇讲解了下RACSignal内部的流程,知道了RACSignal在看RACSubject就简单很多了,毕竟是RACSubject继承与RACSignal,一些方法都是大同小异的。

1 创建信号
+ (instancetype)subject {
    return [[self alloc] init];
}

- (id)init {
    self = [super init];
    if (self == nil) return nil;

    _disposable = [RACCompoundDisposable compoundDisposable];
    _subscribers = [[NSMutableArray alloc] initWithCapacity:1];
    
    return self;
}

2 订阅信号
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
    NSCParameterAssert(subscriber != nil);

    RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
    subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];

    NSMutableArray *subscribers = self.subscribers;
    @synchronized (subscribers) {
        [subscribers addObject:subscriber];
    }
    
    return [RACDisposable disposableWithBlock:^{
        @synchronized (subscribers) {
            // Since newer subscribers are generally shorter-lived, search
            // starting from the end of the list.
            NSUInteger index = [subscribers indexOfObjectWithOptions:NSEnumerationReverse passingTest:^ BOOL (id<RACSubscriber> obj, NSUInteger index, BOOL *stop) {
                return obj == subscriber;
            }];

            if (index != NSNotFound) [subscribers removeObjectAtIndex:index];
        }
    }];
}
3 发送信号
- (void)sendNext:(id)value {
    [self enumerateSubscribersUsingBlock:^(id<RACSubscriber> subscriber) {
        [subscriber sendNext:value];
    }];
}

借用他们的流程图为

1467716-f2b4f5f91210d0ba.png
上一篇下一篇

猜你喜欢

热点阅读