RACSignal *signal = [self.accountField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
RACSignal *newSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:[NSString stringWithFormat:@"map后的字符串+%@",value]];
return nil;
}];
return newSignal;
}];
[signal subscribeNext:^(id _Nullable x) {
//这里的x变量是上面的newSignal
}];
上面代码相当于:
id (^firstBlock)(id value) = ^id _Nullable(NSString * _Nullable value) {
RACSignal *newSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:[NSString stringWithFormat:@"map后的字符串+%@",value]];
return nil;
}];
return newSignal;
}
RACSignal *signal = [self.accountField.rac_textSignal map:firstBlock]; //map:firstBlock返回的是newSignal
[sig subscribeNext:^(id _Nullable x) {
//这里的x变量是上面的newSignal
}];
//map:方法实现
- (__kindof RACStream *)map:(id (^)(id value))firstBlock {
NSCParameterAssert(firstBlock != nil);
Class class = self.class;
return [[self flattenMap:^(id value) {
return [class return:firstBlock(value)]; //这里返回的是一个RACReturnSignal,里面的value属性保存的是firstBlock(value),也就是newSignal
}] setNameWithFormat:@"[%@] -map:", self.name];
}
//map:方法改写
- (__kindof RACStream *)map:(id (^)(id value))firstBlock {
NSCParameterAssert(firstBlock != nil);
Class class = self.class;
//secondBlock返回的是一个RACReturnSignal对象,里面的value属性保存的是firstBlock(value),firstBlock(value)就是newSignal
RACStream * (^secondBlock)(id value)) = ^(id value) {
return [class return:firstBlock(value)];
};
return [[self flattenMap:secondBlock] setNameWithFormat:@"[%@] -map:", self.name];
}
//flattenMap:方法实现
- (__kindof RACStream *)flattenMap:(__kindof RACStream * (^)(id value))secondBlock {
Class class = self.class;
return [[self bind:^{
return ^(id value, BOOL *stop) {
id stream = secondBlock(value) ?: [class empty]; //这里secondBlock(value)就是上面说的RACReturnSignal对象,里面的value属性保存的是firstBlock(value),firstBlock(value)就是newSignal
NSCAssert([stream isKindOfClass:RACStream.class], @"Value returned from -flattenMap: is not a stream: %@", stream);
return stream;
};
}] setNameWithFormat:@"[%@] -flattenMap:", self.name];
}
//flattenMap:方法改写
- (__kindof RACStream *)flattenMap:(__kindof RACStream * (^)(id value))secondBlock {
Class class = self.class;
//这里bindingBlock调用后返回的就是stream = secondBlock(value)
RACSignalBindBlock bindingBlock = ^RACSignal* (id value, BOOL *stop) {
id stream = secondBlock(value) ?: [class empty]; //这里secondBlock(value)就是上面说的RACReturnSignal对象,里面的value属性保存的是firstBlock(value),firstBlock(value)就是newSignal
NSCAssert([stream isKindOfClass:RACStream.class], @"Value returned from -flattenMap: is not a stream: %@", stream);
return stream;
};
return [[self bind:bindingBlock] setNameWithFormat:@"[%@] -flattenMap:", self.name];
}
bind:方法内部:
RACSignal *signal = createSignal:block
在block里面做了下面的事情
调用 id signalA = bindingBlock() //得到的signalA就是上面的stream,也就是secondBlock(value) ,secondBlock(value) 返回的是一个RACReturnSignal对象,里面保存了value = firstBlock(value)
signalA suscribeNext:blockA //因为signalA是一个RACReturnSignal对象,该对象suscribeNext:内signal的订阅者会调用sendNext:方法将value属性(保存的firstBlock(value),也就是newSignal)当做参数传递
[sig subscribeNext:^(id _Nullable x) {
这里收到的就是newSignal
}];
return signal
网友评论