我有一个NSOperation
派生类,它执行异步下载
因为必须从主线程启动下载操作,所以响应也在主线程上完成。
下载完成后,我想对NSOperation
内的下载数据执行更繁重的操作。
如何在现有NSOperation
内的后台线程中完成下载后,如何获取操作?
答案 0 :(得分:3)
如果您不是在NSOperation中移动到主线程,而是在NSOperation运行的当前线程中启动连接。
然后,通过添加NSPort to the NSRunLoop来保持NSURLConnection活着 现在所有回调都将在与您启动连接的线程相同的线程中收到 - 您可以继续在此处执行其他工作,这已经在后台。
答案 1 :(得分:0)
NSOperation只是一项托管任务。您应该使用它在主线程之外进行网络调用。
在NSOperations中处理异步代码的微妙之处在于NSOperation将在回调返回之前完成并退出(并从内存中处理掉)。 NSOperationQueue并不知道或关心您的代码是异步的。
使用现有的runloop进行操作并在NSOperation上显式设置完成将使操作保持活动状态以接收回调并标记自己完成。
当异步回调返回时(在设置操作完成之前),NSOperation中的代码应该通过发送一个块来更新UI来调用主线程。
不要期望在完成任务之后保持NSOperation。它是一个一次性的任务对象,在完成后不应该存在。
根据现有答案的建议,您应该在NSOperation中进行尽可能多的处理网络调用本身的处理。