RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"sendNext");
[subscriber sendNext:@{@"name":@"n",@"age":@"a"}];
return nil;
}];//模拟请求用户数据
RACSignal *nameSignal = [signal flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
return [RACSignal return:[value objectForKey:@"name"]];
}];
RACSignal *ageSignal = [signal flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
return [RACSignal return:[value objectForKey:@"age"]];
}];
[nameSignal subscribeNext:^(id _Nullable x) {
NSLog(@"name %@",x);
}];
[ageSignal subscribeNext:^(id _Nullable x) {
NSLog(@"age %@",x);
}];
这里会请求两遍 因为这个信号是冷信号
nameSiagnal和ageSiagnal被订阅的时候间接的对原信号进行订阅
热信号是主动的,即使你没有订阅事件,仍然执行。可以一对多,所有订阅者共享消息
冷信号是被动的,只有你订阅事件才会发送消息。冷信号只能一对一,当有不同的订阅者订阅事件,消息会重新完整发送
避免这种情况需要把冷信号转换成热信号
RACSignal *signal = [[RACSignal getCurrentUserModel] replayLazily];
将冷信号转换为热信号的方法
- (RACMulticastConnection<ValueType> *)publish RAC_WARN_UNUSED_RESULT;
- (RACMulticastConnection<ValueType> *)multicast:(RACSubject<ValueType> *)subject RAC_WARN_UNUSED_RESULT;
- (RACSignal<ValueType> *)replay;
- (RACSignal<ValueType> *)replayLast;
- (RACSignal<ValueType> *)replayLazily;
具体使用:面向wiki编程 (Google,baidu,注释,wiki)