3
我有一個長期運行的任務,將串行運行在後臺隊列上。GCD異步串行隊列 - 可能限制隊列大小?
一個特殊的要求是,我想最大隊列大小爲1,並且它是LIFO。
因此,如果N件物品在工作時運行,我希望它們都被丟棄,除了最近的一件。類似於「去抖」如何工作。
我有一個長期運行的任務,將串行運行在後臺隊列上。GCD異步串行隊列 - 可能限制隊列大小?
一個特殊的要求是,我想最大隊列大小爲1,並且它是LIFO。
因此,如果N件物品在工作時運行,我希望它們都被丟棄,除了最近的一件。類似於「去抖」如何工作。
這種類型的東西通常用GCD中的DISPATCH_SOURCE_TYPE_DATA_OR
來源完成。這將多個請求(通過dispatch_source_merge_data()
觸發)合併成源事件處理程序的單個調用。
它被限制爲可用dispatch_source_get_data()
(與傳遞給merge_data()的所有值一起原子地進行OR操作,可合併到處理程序的特定調用中)的64位「payload」。
另外一個DATA_ADD
源可用於簡單計數有多少請求合併到一個處理程序調用中。
如果在事件處理程序正在執行時發出請求,則在前一次調用完成後立即再次運行事件處理程序(傳遞在執行前一個處理程序期間合併的所有請求)。
最大堆會爲你的目的工作嗎? – JaredH
你可以在你的操作中取消AllOperationsQueue,然後添加任何新的blockOperation:[operationQueue cancelAllOperations]; [operationQueue addOperation:myblockOperation]; – Idali