1

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

下载完成后,我想对NSOperation.

下载完成后如何在现有的后台线程中再次执行操作NSOperation

4

2 回答 2

3

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

然后,通过将NSPort 添加到 NSRunLoop 来保持 NSURLConnection 活动。
现在,所有回调都将在与您开始连接的线程相同的线程中接收 - 您可以继续在这里执行您的额外工作,这已经在后台。

于 2012-10-20T20:37:43.163 回答
0

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

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

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

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

不要指望在它完成任何操作后保留 NSOperation。它是一个一次性任务对象,完成后不应该存在。

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

于 2012-10-20T22:26:56.363 回答