1,rac_liftSelector(相当于多线程组)
- 说明:当需要请求多个数据,在所有数据请求完成之后才进行更新UI或者类似的事情的时候,可以用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,解决循环引用问题:
- 有一个需要注意的问题:在block内部尽量用self来引用控制器的成员变量, 这样子如果有循环引用的时候可以用“信号外部用@weakify,内部用@strongify”这个方式来解决,如果直接用“_”来引用成员变量,可能会解决不了循环引用的问题
//问题:在信号中打印了控制器,也就是强引用了控制器,控制器中又强引用了信号,如下,就会形成循环应用
//信号外部用@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);
}];