在NSOperation子类中发送多个请求:同步还是异步模式?

时间:2012-03-27 15:54:48

标签: ios asynchronous asihttprequest nsoperation synchronous

我在SO内搜索了很多,但我找不到正确的答案。 这里的问题是:

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

  1. 首先从本地数据库中检索数据
  2. 然后它将组合数据发送到Web服务器
  3. 因为,这两个操作可能需要一段时间才能执行,我已经如上所述将它们包裹在NSOperation内。

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

    为了执行类似的上传,我正在以如下的同步方式使用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. 这是将数据上传到网络服务器的有效解决方案吗?
    2. 在后台线程中创建ASIHTTPRequest *request是否有效?
    3. 我是否必须使用异步模式?如果是,怎么样?
    4. 注意我正在使用ASIHttpRequest进行同步请求,但我认为可以通过NSUrlConnection类通过

      应用相同的模式
      sendSynchronousRequest:returningResponse:error:
      

      提前谢谢。

2 个答案:

答案 0 :(得分:2)

直接回答您的问题:

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

  2. 您可以在后台主题中创建NSUrlConnections,但这里有几点要记住:

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

    NSUrlConnnection委托回调回调创建NSUrlConnection的线程。只需记住一些事情。

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

  4. 一个注意事项:我会重新考虑使用ASI,因为它不再受支持。 AFNetworking似乎是最受欢迎的替代品,但我选择直接使用NSUrlConnection

答案 1 :(得分:1)

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

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

调用它
nsurlconnection sendSynchronousRequest:returningResponse:error:
  1. async模式不适用于后台线程,只能在主线程上使用它们。
  2. 希望它有所帮助。