2012-10-20 61 views
1

我有一個NSOperation派生類,它執行異步下載。
由於下載操作必須從主線程啓動,響應也在主線程上完成。如何在NSOperation中實現異步網絡調用

一旦下載完成,我想對NSOperation內下載的數據執行更重的操作。

如何在下載完成後在現有的NSOperation內的後臺線程中執行操作?

回答

3

如果您不是轉移到NSOperation中的主線程,而是啓動您的NSOperation運行的當前線程中的連接。

然後,通過添加NSPort to the NSRunLoop使NSURLConnection保持活動狀態。
現在所有回調都將在與您開始連接的線程相同的線程中接收 - 並且您可以繼續在此處執行額外的工作,這些工作已在後臺。

0

NSOperation只是一項管理任務。您應該使用它在主線程之外進行網絡調用。

在處理NSOperations中的異步代碼時,微妙之處在於NSOperation將在回調返回前完成並退出(並從內存中丟棄)。 NSOperationQueue不知道或關心你的代碼是異步的。

使用了運行中存在的runloop,並明確對的NSOperation設置完成將保持運行活着收到回調和自身標記爲完成。

當異步回調返回的NSOperation內的代碼應儘可能通過發送塊更新UI使主線程調用(設置操作完成之前)。

不要期望在NSOperation完成後用它來做任何事情。它是一個一次性任務對象,它不應該在它完成後才能生存。

正如現有答案中所建議的那樣,您應該在NSOperation中執行儘可能多的網絡自身調用的處理。