如何在NSOperation中实现异步网络调用

时间:2012-10-20 20:11:40

标签: iphone ios multithreading nsoperation

我有一个NSOperation派生类,它执行异步下载 因为必须从主线程启动下载操作,所以响应也在主线程上完成。

下载完成后,我想对NSOperation内的下载数据执行更繁重的操作。

如何在现有NSOperation内的后台线程中完成下载后,如何获取操作?

2 个答案:

答案 0 :(得分:3)

如果您不是在NSOperation中移动到主线程,而是在NSOperation运行的当前线程中启动连接。

然后,通过添加NSPort to the NSRunLoop来保持NSURLConnection活着 现在所有回调都将在与您启动连接的线程相同的线程中收到 - 您可以继续在此处执行其他工作,这已经在后台。

答案 1 :(得分:0)

NSOperation只是一项托管任务。您应该使用它在主线程之外进行网络调用。

在NSOperations中处理异步代码的微妙之处在于NSOperation将在回调返回之前完成并退出(并从内存中处理掉)。 NSOperationQueue并不知道或关心您的代码是异步的。

使用现有的runloop进行操作并在NSOperation上显式设置完成将使操作保持活动状态以接收回调并标记自己完成。

当异步回调返回时(在设置操作完成之前),NSOperation中的代码应该通过发送一个块来更新UI来调用主线程。

不要期望在完成任务之后保持NSOperation。它是一个一次性的任务对象,在完成后不应该存在。

根据现有答案的建议,您应该在NSOperation中进行尽可能多的处理网络调用本身的处理。