2011-07-26 69 views
3

爲了維護NSOperationQueue和NSInvocationOperation,上下文中都要求提出以下兩個問題。如何從NSOperationQueue中刪除/取消NSInvocationOperation?

正如我已經使用這個概念下載多個視頻,我如何刪除/釋放完成下載視頻後添加NSOvrationQueue的NSInvocationOperation?

而且,如果我想要在下載過程中停止下載特定視頻,該怎麼辦?

回答

5

如何刪除/釋放下載視頻完成後從NSOperationQueue添加NSInvocationOperation?

該操作在完成時自動從隊列中刪除,即 - isFinished返回true時。

而且,如果我想在下載過程中停止下載特定視頻時該怎麼辦?

當您想要中途停止某項操作時,必須將其發送給-cancel消息。 但是這不會神奇地停止運行的操作。你的任務需要定期檢查它是否被取消,如果事實證明它已經完成了,那麼它就完成了。因此,您需要分塊下載視頻,並在每個塊後檢查操作的取消狀態。下面的僞代碼可能會有所幫助:

while (![myOperation isCancelled] && thereIsMoreData) 
{ 
    download a chunk of data and save it 
} 

這意味着,例如,你不能用NSURLConnection-sendSynchronousRequest:returningResponse:error:來獲取數據,因爲它不能夠檢查操作的取消狀態,直到畢竟數據已經下載。

+0

我已經實現了相同的邏輯,但由於NSOperationQueue的混淆,我缺乏一點點。感謝JeremyP的描述性答覆。它的工作完美,因爲我想。 –

+0

我可以暫停視頻的異步下載過程嗎? –

+0

我認爲你真的想放棄一段時間的連接。如果是這樣的話,它可能取決於服務器。例如,HTTP/1.1有一個'range'頭,它允許客戶端請求部分下載,但是服務器不需要實現這個邏輯。 – JeremyP

1

在NSOperation完成該任務後,它將自動從隊列中刪除。參考號link

製作NSOperation的子類。爲每個操作保留一個標識符。將所有操作存儲在數組中。當U不想操作繼續,只是給取消消息的操作,即,[_operation cancel];

+0

感謝Gomathi爲您的快速和有益的回覆... :) –

+0

但我如何獲得NSInvocationOperation對象提前取消?我知道我可以在操作對象上調用-cancel方法,但是如何獲得對操作對象的引用,以便我可以使用'if(myOperation.cancelled == true)然後退出早期'? –