我正在尝试编写一个永远迭代的代码,这就是我编写它的方式:
- (void) testRepeat {
__block DataClass * dc = [[DataClass alloc] init];
[[[[self repeatFunc:dc ]
doNext:^(id x) {
dc = nil;
}]
repeat]
subscribeNext:^(id x) {
NSLog(@"next");
} completed:^{
NSLog(@"completed");
}];
}
- (RACSignal *) repeatFunc: (DataClass *) dc {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"dc : %@", dc);
[subscriber sendNext:nil];
[subscriber sendCompleted];
return nil;
}];
}
代码第一次迭代时,对象&#34; dc&#34;的值是正确的。在第一次调用repeatFunc之后,我正在设置&#34; dc&#34;然而,当它反复回来时,&#34; dc&#34;没有反映,它仍然是以前的值。
实现上述目的的正确方法是什么?
答案 0 :(得分:0)
方法-repeatFunc:
捕获对其自己指向dc
的指针的不可变引用,因此每个repeat
发送该引用,而不是您拥有nil
&的本地引用#39; d out。
可以这样做:
__block DataClass *dc = [[DataClass alloc] init];
RACSignal *signal = [[[RACSignal
defer:^{
return [RACSignal return:dc];
}]
doNext:^(id x) {
dc = nil;
}]
repeat];
但是更具功能性的表达方式是:
[[[RACSignal return:nil] repeat] startWith:dc];