GCD常用的幾個方法

weixin_34239169發表於2016-08-14

一.dispatch_barrier_async 柵欄塊

在一個自定義的並行佇列中執行多個任務block時,如果接下來要處理的是barrier block, barrier block並不會立即執行,而是要一直等待barrier block 前面的所有其他併發block執行完畢才會執行barrier block,任何提交到barrier block之後的在此佇列中執行的block只有等到barrier block執行完畢,才會接著向下執行

注意:這個佇列要是使用者通過dispatch_queue_create建立的自定義佇列,而且還要是並行佇列,
對於序列佇列和全域性佇列不起作用,會按照普通的block執行

1.在全域性佇列中非同步執行,會按照dispatch_async方式執行

683523-a53ce4009a4eac95.png
683523-0b970ac1c150b6b2.png

2.自定義並行佇列中執行

683523-5505f014397278dd.png

二.dispatch_group_async 分派組

將並行佇列中非同步的多個任務合併為一組,等到這組任務完成後,通過利用dispatch_group_notify回撥得到這組任務完成的通知
例如:當非同步下載多張圖片的時候,需要等到所有圖片下載完成之後,去通知使用者下載完成,就可以這麼來幹

683523-4e903252f3015205.png

可以利用 dispatch_group_enter(dispathch_group_t group) dispatch_group_leave(dispathch_group_t group),來加入到指定的group中,這兩個方法必須是成對出現的,否則會出現記憶體洩露 

683523-e232ae62b7ca387e.png

有兩個方法可以用來得到回到的通知 
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
這個方法會阻塞線層,只有當前group上所有的任務完成才會繼續往下執行
dispatch_group_notify 
這個方法不會阻塞線層,這行程式碼之下所加到這個group的任務也包含在內

相關文章