ReactiveCocoa repeat命令不使用修改后的值

时间:2014-12-05 19:21:07

标签: ios reactive-cocoa

我正在尝试编写一个永远迭代的代码,这就是我编写它的方式:

- (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;没有反映,它仍然是以前的值。

实现上述目的的正确方法是什么?

1 个答案:

答案 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];