反应性可可 避免观察旗帜以产生副作用



我试图了解如何避免在手术后使用标志来执行副作用。在我的代码中,我打开一个网络连接,之后,我设置代码以定期与服务器执行心跳。当在此连接上发送请求时,我需要重置心跳计时器,这是我的代码的样子 -

 (RACSignal *) connect: (NSString *) server {
     return [[MIConnection connect: server ] 
             doComplete {
              [self setupHeartBeat];
            }];
     }
  -(void) setupHeartBeat {
      [[[[[RACObserve (self, heartBeatReset) ignore@(NO)]
       map:^RACStream *(id value) {
           return [RACSignal interval:7
                        onScheduler:scheduler withLeeway:5]
                startWith:[NSDate date]]
        }]
        switchToLatest]
        flattenMap:^RACStream *(MIConnection * theConnection) {
           return [self sendHeartBeat] ;
       }]
        subscribeNext:^(id x) {
        self.heartBeatReset = NO;
         NSLog(@"Done with sending heartbeat");
     }];
    -(RACSignal *) sendRequest: (id) request {
     return [[MIConnection sendRequest: request ] 
             doComplete {
              self.heartBeatReset = YES;
            }];
     }

如您所见,我正在使用一个标志"heartBeatReset"来重置要发送心跳的计时器。实现上述目标的更好方法是什么?谢谢

标志属性可以替换为空方法。然后,-setupHeartBeat的实现可以在空方法上使用-rac_signalForSelector:,而不是在标志上使用RACObserve。调用空方法在语义上与将YES分配给标志相同。

- (void)resetHeartBeat {
}
- (RACSignal *)sendRequest:(id)request {
    return [[MIConnection sendRequest:request]
        doComplete {
            [self resetHeartBeat];
        }];
}
- (void)setupHeartBeat {
    RACSignal *heartBeatTimer = [[RACSignal
        interval:7 onScheduler:scheduler withLeeway:5]
        startWithDate:[NSDate date]];
    [[[[[self
        rac_signalForSelector:@selector(resetHeartBeat)]
        mapReplace:heartBeatTimer]
        switchToLatest]
        flattenMap:^(id _) {
            return [self sendHeartBeat];
        }]
        subscribe:nil];
}

最新更新