【问题标题】:ReactiveCocoa, Serialize network requests without fire & forgetReactiveCocoa,无火序列化网络请求并忘记
【发布时间】:2014-12-17 19:21:28
【问题描述】:

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

- (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 可以帮助缓冲请求,但它是很好的一劳永逸。

【问题讨论】:

    标签: ios reactive-cocoa


    【解决方案1】:

    我能够使用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");
     }];
    

    【讨论】:

      【解决方案2】:

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

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

      请随意尝试。

      【讨论】:

        猜你喜欢
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多