2014-12-13 58 views
0

我想了解如何避免使用标志执行操作后的副作用。在我的代码中,我打开了一个网络连接,之后我设置了代码来定期执行服务器的心跳。当一个请求该连接上发送,我需要重置心脏搏动计时器,这是我的代码看起来是 -反应可可避免在旗帜上观察执行副作用

(RACSignal *) connect: (NSString *) server { 
    return [[MIConnection connect: server ] 
      doComplete { 
       [self setupHeartBeat]; 

      }]; 
    } 

    -(void) setupHeartBeat { 
     [[[[[RACObserve (self, heartBeatReset) [email protected](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”,复位定时器为心跳发送。什么会是更好的方式来实现上述?谢谢

回答

0

标志属性可以替换为空方法。然后-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]; 
} 
+0

谢谢!!!这非常有帮助。我将改变我的代码以结合上述内容。 – 2014-12-15 13:59:18