1

希望這些問題對於那些人來說似乎很有幫助。我一直在學習客觀的c,mostly from this book,我發現即使對於noob,它也是令人驚歎和有用的。我的問題都必須處理這個問題:盛大的中央調度,操作隊列,異步,查看將會消失

當用戶改變視圖時,隊列會發生什麼?我似乎無法在任何地方找到很好的解釋。

根據我的理解,使用NSOperation及其隊列,你可以使用「取消」來取消它......但是如果你不想取消它呢?如果用戶選擇多個圖像上傳到服務器,並且用該訂單創建一個隊列,並且用戶切換到新的視圖控制器,該怎麼辦?這可能非常耗時,尤其是在移動網絡速度較慢的情況下。我記得有些地方iOS會給我們20秒左右的額外時間來完成它的工作,但我認爲這只是在應用程序進入後臺時。

對於GCD,沒有取消方法......所以如果使用異步,後臺會發生什麼?我想如果你沒有對隊列的響應,我的意思是你不以任何方式更新UI,不應該在隊列完成後才發送到另一個線程?

我相信還有更多的東西我不明白,只要線程去,但我希望我明確提出了我的問題。請不要告訴我使用AFNetworking的東西...我嘗試使用所有那些鑰匙串包裝,並且都失敗了。感謝這本書,書中直接的Apple代碼完成了一切。在使用更簡單的方法之前,我寧願先學習基礎知識。

如果有人花時間討論這個問題,我會非常感激。提前致謝!

回答

2

您只關注完成任務所需的時間只適用於從應用切換到另一個應用時。在這種情況下,您可以使用beginBackgroundTaskWithExpirationHandler方法,以便您的應用可以請求時間來完成這些任務,如果您的應用碰巧進入後臺。有關更多信息,請參閱iOS應用程序編程指南App States and Multitasking部分的背景部分中執行有限長任務。

但是如果你仍然是你的應用程序中(不管你轉換到另一個視圖控制器或沒有),任何你已經添加到您的操作隊列將繼續運行,直到取消這些操作(或應用程序被暫停或終止)。同樣,您添加到GCD隊列中的任何內容都將繼續運行,直到該應用被暫停或終止。

在這兩種情況下,上述beginBackgroundTaskWithExpirationHandler都會在您的應用進入後臺後給您幾分鐘的時間來完成排隊的任務/操作。

+0

好吧,這很瞭解!感謝您的鏈接了。還有一個問題,哪個更好用?現在我對GCD很滿意,因爲它直接切換到主線程和分組任務。這只是個人喜好嗎? – denikov

+1

@denikov GCD適合一次性任務。如果您有很多操作並且想限制可以同時運行多少個操作(使用'maxConcurrentOperationCount'),或者您需要對操作之間的依賴關係進行細粒度控制,則通常使用操作隊列。順便說一句,操作隊列最簡單的形式並不比GCD調度隊列更難(例如,而不是'dispatch_async(dispatchQueue,^ {...})'你會做'[operationQueue addOperationWithBlock:^ {...} GCD對於較低級別的任務是非常有用的,例如同步對象,定時器,信號等的訪問。 – Rob

+1

個人而言,我對這些較低級別的任務使用GCD,但使用操作隊列來執行應用程序級別的任務(例如網絡請求,圖像處理等)。 – Rob