【问题标题】:Serialize webservice calls and callbacks序列化 web 服务调用和回调
【发布时间】:2014-12-16 20:53:49
【问题描述】:

我有一个发送 web 服务调用并通过委托传递响应的类。 我现在想在视图和我的 web 服务类之间添加一个缓存层。 这个新类应该序列化调用,每次调用都会延迟到前一个调用的回调完成。

我试图通过 GCD 实现这一点:

- (void)callWebserviceFunctionX {
    dispatch_group_notify(self.serviceGroup, self.serialQueue, ^{
        dispatch_group_enter(self.serviceGroup);

        // call webservice
    });
}

在回调中:

-(void)callbackFunctionXWithResponse:(id)response {
    // do something

    dispatch_group_leave(self.serviceGroup);
}

使用dispatch_group_enterdispatch_group_leave对每个呼叫及其回调进行分组并使用dispatch_group_notify等待之前的组的想法。

但是,这种方法似乎没有按我的预期工作。 有没有更好的方法来实现这一点?

更新:
我尝试了dispatch_group_enterdispatch_group_leavedispatch_group_notifydispatch_group_async的所有组合,但没有成功。
我也想过NSOperationNSOperationQueue,但是——如果我理解正确的话——那将迫使我为每个Web服务调用编写一个单独的类。

还有其他我没有想到的选择吗?

【问题讨论】:

    标签: ios web-services serial-processing


    【解决方案1】:

    我认为你最好使用 NSOperation,它们之间的依赖关系来确保序列化和 NSOperationQueue 来运行它们。

    为了避免为每个请求创建一个 NSOperation 子类,您可以使用内置的 NSBlockOperation,您为每个实例提供一个块,并在 NSBlockOperation 实例之间添加依赖项应该为您提供目标序列化。

    希望这会有所帮助。

    问候

    【讨论】:

    • 谢谢!我选择了这个答案而不是第一个,因为它不包含第三方框架,并且通过使用 NSBlockOperation 避免了大量的子类。
    • 我正在成功使用这样的解决方案。我还在每个块的开头添加了 operationQueue.isSuspended = true,在每个块中运行的异步 Web 服务的 completionBlock 中添加了 operationQueue.isSuspended = false。还有 operationQueue.maxConcurrentOperationCount = 1 这允许我的队列被序列化并在遇到错误时停止处理,以便可以进行适当的恢复。
    【解决方案2】:

    您可以使用 MKNetworkKit 作为您的网络解决方案。这在后台使用 NSOperationQueue,您可以使用 NSOperation 依赖项来序列化您的请求/响应。 MKNetworkKit 还支持响应的缓存,因此也可能有助于您的缓存实现。

    MKNetworkKit 概述
    http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/

    有人在使用 MKNetworkKit 和 GCD 时遇到了类似的问题
    MKNetworkKit and GCD dispatch_group_t

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2011-12-10
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多