我们先从创建一个信号开始说起吧
//1创建信号
//createSignal的参数是个block,block的返回值是个RACDisposable类型的对象。参数是满足RACSubscriber协议的对象subscriber.
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"创建信号量");
//3、发布信息
[subscriber sendNext:@"I'm send next data"];
NSLog(@"那我啥时候运行");
return nil;
}];
//2、订阅信号量
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
进入createSignal看看
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
return [RACDynamicSignal createSignal:didSubscribe];
}
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
RACDynamicSignal *signal = [[self alloc] init];
signal->_didSubscribe = [didSubscribe copy];
return [signal setNameWithFormat:@"+createSignal:"];
}
这里面把didSubscribe这个block赋值给了信号的_didSubscribe成员变量。后面在信号调用subscribeNext的时候会用到。
接下来看订阅信号的代码
//2、订阅信号量
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
这里也传递了一个block进去。进入subscribeNext定义里面看看
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}
//上面的代码做了两件事情,1,创建了RACSubscriber对象。调用了信号的subscribe方法,以刚才创建的RACSubscriber对象为参数。
//首先进入创建RACSubscriber对象的类方法里面看看。就是创建对想和响应的赋值。
+ (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed {
RACSubscriber *subscriber = [[self alloc] init];
subscriber->_next = [next copy];
subscriber->_error = [error copy];
subscriber->_completed = [completed copy];
return subscriber;
}
然后再看subscribe方法的实现,还记得刚才我们创建的是RACDynamicSignal类型的对象吗?所以定义在RACDynamicSignal里面
- (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;
}
上面的self.didSubscribe(subscriber)是block调用,didSubscribe就是创建信号时候的block;参数subscriber,也就是subscribeNext:方法里面创建的这个RACSubscriber类型的对象。这个对象的_next属性保存了subscribeNext:这个方法的block参数。
最后看一下发布消息的代码
- (void)sendNext:(id)value {
@synchronized (self) {
void (^nextBlock)(id) = [self.next copy];
if (nextBlock == nil) return;
nextBlock(value);
}
}
这里就是调用了存在于next中的block,这个block就是subscribeNext:方法中的block。
所以这段代码执行之后,调用上面的这个block,输出如下:
创建信号量
I'm send next data
那我啥时候运行
//后续所有RAC相关的代码都在这个Demo中
Demo:https://github.com/BigFish2018/MVVM.git
参考:
https://www.jianshu.com/p/35a28cf0a22f
http://www.cocoachina.com/ios/20150123/10994.html
网友评论