ReactiveCocoa,无需火灾即可序列化网络请求。忘记

时间:2014-12-17 19:21:29

标签: ios reactive-cocoa

我正在尝试实现代码,因此我可以序列化网络请求,基本上,下一个请求应该在第一个请求完成后才开始。我也想订阅这些请求,所以我可以处理错误。代码如下所示:

- (RACSignal * ) sendRequest: (Request *) request{

  [[[RACSignal return:nil
  deliverOn: [RACScheduler scheduler]
  mapReplace: [self.network sendRequest]]; // A different thread is spawned to execute the request

}

,它被称为:

[self sendRequest:request
 subscribeNext: ^(id x) {
      NSLog(@"Request has been sent");
 }];

请注意,可以从多个线程并行调用sendRequest,因此需要对请求进行排队。

将请求放在同一个调度程序上,不起作用,因为发送发生在另一个线程上,下一个请求在上一个请求完成之前被拾取。 我还研究了使用RACSubject来帮助缓冲请求,但这对于火灾和遗忘都是有好处的。

2 个答案:

答案 0 :(得分:0)

我能够使用concat命令实现上述功能,因此它类似于:

- (RACSignal * ) sendRequest: (Request *) request subscriber:(id<RACSubscriber>) subscriber{

  [[[RACSignal return:nil
  deliverOn: [RACScheduler scheduler]
  flattenMap:^RACStream *(id value) {
      [self.network sendRequest]]; // A different thread is spawned to execute the request
   }]
   doNext: ^(id x) {
   [subscriber sendNext];
 }

[[self sendRequest:request
 concat]
 subscribeNext: ^(id x) {
  NSLog(@"Request has been sent");
 }];

答案 1 :(得分:0)

事实证明NSOperationQueue是不可避免的。

我已经RACSerialCommand来序列化命令执行。它有一个类似于RACCommand的接口,但内置NSOperationQueue来序列化执行。

随意尝试。