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);
}];
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。