2013-02-21 107 views
9

我正在嘗試重新排定將處理更新操作的排隊塊。 主要目標是用最少量的(UI更新請求)更新UI對象(在線用戶表...)。 (服務器有時會降低大量更新,耶!)如何從GCD調度隊列中刪除排隊的塊?

爲簡單起見,主要的情況是;

  • 的dispatch_queue_t實例(隊列將要處理給定的UI更新塊)是一個串行調度隊列(專用調度隊列)

  • 操作(UI更新塊)被調度以dispatch_after與噸量時間(而不是更新每個數據集更新,在t時間內收集更新請求併爲它們執行單個UI更新)

  • 如果我們的數據集已更新,請檢查是否已存在預定事件。如果是,請從dispatch_queue_t實例取消調度。然後用t時間延遲重新調度相同的塊。

另外;

t是用戶可能不會注意到的一小段時間間隔(如500毫秒) 任何其他方法都是可以接受的。

我背後的動機;

我應用相同的邏輯通過Android的處理程序(後& removeCallbacks組合與Runnable實例),我希望我可以在iOS上實現相同。

編輯:

作爲@Sven建議NSOperationQueue的使用是更合適的爲場景,因爲它們支持消除每個的NSOperation。我通過文件瀏覽並找到;

取消操作 一旦添加到操作隊列,操作對象被有效地由隊列擁有和不能被移除。取消操作的唯一方法是取消操作。 您可以通過調用取消方法來取消單個操作對象,也可以通過調用隊列對象的cancelAllOperations方法來取消隊列中的所有操作對象。

只有在確定不再需要時才應取消操作。發出取消命令會將操作對象置於「取消」狀態,從而阻止其運行。由於取消的操作仍被視爲「已完成」,因此依賴於它的對象將收到相應的KVO通知以清除該依賴關係。因此,取消所有排隊操作以響應某些重大事件(如應用程序退出或用戶特別請求取消)而不是選擇性取消操作更爲常見。

回答

7

您無法刪除或以其他方式更改在調度隊列上排隊的操作。嘗試使用支持取消的較高級別NSOperationQueue

+0

我一直想看看NSOperationQueue的,因爲他們是在AFNetworking框架大量使用。謝謝,如果可能的話,我會看看並標記爲答案。 – 2013-02-21 16:04:33

13

這也可以很容易地用GCD完成,不需要在這裏找到NSOperationQueue的大錘。

只需使用一個非重複的調度定時器源,而不是直接dispatch_after(這僅僅是圍繞着這樣一個定時器源一個便利的包裝,它實際上並不排隊該塊到隊列中,直到定時器熄滅)。

您可以重新掛起計時器源進行執行與dispatch_source_set_timer()

+1

'NSOperationQueue'是圍繞GCD隊列只是Objective-C的包裝。你爲什麼認爲它是「大錘」?它也爲我提供了更簡單的界面,所以我更喜歡它。 – Tricertops 2013-02-21 22:09:53

+11

這是不正確的。 NSOperationQueue不是GCD的包裝,它是從GCD完全分開實現一個非常複雜的排隊,依賴和優先跟蹤系統。它在內部使用GCD進行一些同步(與自旋鎖和互斥鎖一起),但在執行客戶端代碼方面,與GCD的唯一連接是NSOperationQueue在末尾對全局併發隊列執行dispatch_async()以在其執行操作準備好這樣做。所有這些複雜性和靈活性都需要付出代價,NSOperationQueue比簡單操作的GCD慢1000倍。 – das 2013-02-22 07:52:13

+5

的NSOperation圍繞GCD更高級別的併發包裝,使用志願和GCD元到隊列中管理的依賴關係。 QA1712,NSOperationQueue類的引用以及併發編程指南都提到了這一點。 NSOperations不應比GCD較慢爲簡單的操作(即addOperationWithBlock)次「1000」。如果是這樣,你還在做其他事情。 – quellish 2013-02-24 06:52:36