2012-03-27 63 views
1

我在这里搜索了很多,但是我找不到我的问题的正确答案。 这里的问题:在NSOperation子类中发送多个请求:同步还是异步模式?

我想出了在NSOperation子类内发送多个上传请求的正确机制。

  1. 首先,它从本地分贝检索数据
  2. 然后将合成的数据发送到网络服务器

由于,这些:特别地,这类其main方法内执行两个不同的操作两个操作可能需要一段时间才能执行,我已经说过,在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. 这是一个有效的解决方案将数据上传到Web服务器?
  2. 是否有效在后台线程中创建ASIHTTPRequest *request
  3. 我必须使用异步模式吗?如果是,如何?

注意我使用ASIHttpRequest的同步请求,但我认为同样的模式可以用NSUrlConnection类通过

sendSynchronousRequest:returningResponse:error: 

应用于预先感谢您。

只要你想在后台线程中使用 ASIHTTPRequest你必须只调用同步调用打电话,因为线程将尽快在发送关闭请求,
+1

我已经在我的项目中做了类似的事情没有任何问题。 NSOperation这是一个下载ASIHTTPRequest。 – msk 2012-03-30 06:29:38

回答

2

直接回答你的问题:

  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

+ 1为您的支持。谢谢。 – 2012-04-03 07:30:34

1

和有关问题

1,这是有效的解决方案,但通话使用synchronours只有 2.您可以拨打ASIHTTPRequest在后台线程,也可以使用

nsurlconnection sendSynchronousRequest:returningResponse:error: 
  1. async格局不会为后台线程工作,你个人有T称它为只在主线程上使用它们。

希望它有帮助。

+1

+1获得支持。谢谢。 – 2012-04-03 07:30:08