2016-06-22 73 views
3

我有一個長期運行的任務,將串行運行在後臺隊列上。GCD異步串行隊列 - 可能限制隊列大小?

一個特殊的要求是,我想最大隊列大小爲1,並且它是LIFO。

因此,如果N件物品在工作時運行,我希望它們都被丟棄,除了最近的一件。類似於「去抖」如何工作。

+0

最大堆會爲你的目的工作嗎? – JaredH

+0

你可以在你的操作中取消AllOperationsQueue,然後添加任何新的blockOperation:[operationQueue cancelAllOperations]; [operationQueue addOperation:myblockOperation]; – Idali

回答

2

這種類型的東西通常用GCD中的DISPATCH_SOURCE_TYPE_DATA_OR來源完成。這將多個請求(通過dispatch_source_merge_data()觸發)合併成源事件處理程序的單個調用。

它被限制爲可用dispatch_source_get_data()(與傳遞給merge_data()的所有值一起原子地進行OR操作,可合併到處理程序的特定調用中)的64位「payload」。

另外一個DATA_ADD源可用於簡單計數有多少請求合併到一個處理程序調用中。

如果在事件處理程序正在執行時發出請求,則在前一次調用完成後立即再次運行事件處理程序(傳遞在執行前一個處理程序期間合併的所有請求)。