【问题标题】:Sending multiple requests within an NSOperation subclass: sync or async pattern?在 NSOperation 子类中发送多个请求:同步还是异步模式?
【发布时间】:2012-03-27 15:54:47
【问题描述】:

我在 SO 中进行了很多搜索,但我找不到我的问题的正确答案。 问题来了:

我正在寻找在NSOperation 子类中发送多个上传请求的正确机制。特别是,这个类在其main 方法中执行了两个不同的操作:

  1. 首先它从本地数据库中检索数据
  2. 然后它将组合数据发送到 Web 服务器

由于这两个操作可能需要一些时间才能执行,所以我将它们包装在 NSOperation 中。

为了上传数据,我决定采用同步模式(我需要将我的应用程序与已成功提交到网络服务器的上传请求数量同步)。

为了执行类似的上传,我以如下同步方式使用 ASIHttpRequest。

for (int i = 0; i < numberOfUploads; i++) {

    // 1-grab data here...

    // 2-send data here
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request startSynchronous];
    NSError *error = [request error];
    if (!error) {
        int response = [request responseStatusCode];
        if(response == 200)
            uploads++;
    }
}

所以,我的问题是:

  1. 这是将数据上传到 Web 服务器的有效解决方案吗?
  2. 在后台线程中创建ASIHTTPRequest *request 是否有效?
  3. 我必须使用异步模式吗?如果是,怎么做?

注意我正在使用 ASIHttpRequest 进行同步请求,但我认为相同的模式可以通过 NSUrlConnection 类应用

sendSynchronousRequest:returningResponse:error:

提前谢谢你。

【问题讨论】:

  • 我已经在我的项目中做类似的事情,没有任何问题。 NSOperation 是一个下载 ASIHTTPRequest。

标签: ios asynchronous asihttprequest nsoperation synchronous


【解决方案1】:

直接回答您的问题:

  1. 是的,使用同步调用调用 NSUrlConnection(在您的情况下为 ASI 包装器)在 NSOperation 中有效。

  2. 您可以在后台线程中创建NSUrlConnections,但这里有几件事要记住:

    如果您在后台线程上使用它,您必须调用同步方法,或者您必须自己保持线程处于活动状态。在NSOperation 中使用async 在这里得到了很好的解释:How do I do an Asychronous NSURLConnection inside an NSOperation? 我已经使用过这种模式并且效果很好。

    NSUrlConnnection 委托回调回调到创建NSUrlConnection 的线程。只是要记住的东西。

  3. 您不必使用async 模式,但可以。异步模式提供了更大的灵活性。例如,如果您需要取消操作,您可以使用async 模式取消NSUrlConnection 请求。使用同步模式,你不得不让它运行(除非你明确地终止线程)。

请注意:我会重新考虑使用 ASI,因为它不再受支持。 AFNetworking 似乎是最受欢迎的替代品,虽然我选择直接开始使用 NSUrlConnection

【讨论】:

  • +1 表示支持。谢谢。
【解决方案2】:

当您想在后台线程中使用ASIHTTPRequest 调用时,您必须只调用同步调用,因为线程会在发送请求后立即关闭请求,以及您的问题

1,这是有效的解决方案,但仅使用同步器调用 2.您可以在后台线程中调用ASIHTTPRequest,也可以使用

nsurlconnection sendSynchronousRequest:returningResponse:error:
  1. async 模式不适用于后台线程,您只能在主线程上使用它们。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多