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