RAC使用的一些小问题

    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id  _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 *)publish RAC_WARN_UNUSED_RESULT;

- (RACMulticastConnection *)multicast:(RACSubject *)subject RAC_WARN_UNUSED_RESULT;

- (RACSignal *)replay;

- (RACSignal *)replayLast;

- (RACSignal *)replayLazily;

具体使用:面向wiki编程 (Google,baidu,注释,wiki)

你可能感兴趣的:(RAC使用的一些小问题)