ReactiveCocoa

RAC中级用法:liftSelector和循环引用解决

2017-01-02  本文已影响850人  张不二01

1,rac_liftSelector(相当于多线程组)

 //当多次数据请求时,需要全部请求结束之后才会进行下一步UI刷新等,可以用这个rac_liftSelector
//第一部分数据
    RACSignal *section01Signal01 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"section01数据请求");
        [subscriber sendNext:@"section01请求到的数据"];
        return  nil;
    }];
    
//第二部分数据
    RACSignal *section01Signal02 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"section02数据请求");
        [subscriber sendNext:@"section02请求到的数据"];
        
        return  nil;
    }];
    
//第三部分数据
    RACSignal *section01Signal03 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"section03数据请求");
        [subscriber sendNext:@"section03请求到的数据"];
        
        return  nil;
    }];
    
    //如果还是按照之前的常规方法订阅信号,那么是没有办法在全部数据请求完成之后再进行其他操作的,如果需要,使用rac_liftSelector
    /*
     [section01Signal01 subscribeNext:^(id x) {
     NSLog(@"%@", x);
     }];
     [section01Signal02 subscribeNext:^(id x) {
     NSLog(@"%@", x);
     }];
     [section01Signal03 subscribeNext:^(id x) {
     NSLog(@"%@", x);
     }];
     */

    //可以在所有信号请求完成之后再执行方法,只需把三个结果传出去即可
    [self rac_liftSelector:@selector(refreshUI:::) withSignals:section01Signal01,section01Signal02,section01Signal03, nil];

2,解决循环引用问题:

    //问题:在信号中打印了控制器,也就是强引用了控制器,控制器中又强引用了信号,如下,就会形成循环应用
    //信号外部用@weakify,内部用@strongify
    @weakify(self);
    
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        [subscriber sendNext:@"zhangdanfeng"];
        
        @strongify(self);
        NSLog(@"%@",self);
        return  nil;
    }];
    
    //这里是强引用
    self.signal = signal;
    
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
上一篇 下一篇

猜你喜欢

热点阅读