場景
在開發(fā)過程中會經(jīng)常出現(xiàn)這樣的一個場景葫笼,就是需要刷新一個界面數(shù)據(jù),而這個界面數(shù)據(jù)需要發(fā)起多個請求才能獲得拗馒,例如:一個用戶信息界面路星,包括基本數(shù)據(jù),關(guān)聯(lián)數(shù)據(jù),其他特別數(shù)據(jù)等洋丐,這幾種數(shù)據(jù)存在相互依賴的關(guān)系呈昔,并且獲取每種數(shù)據(jù)的api不同,需要同時異步發(fā)起多個請求友绝。在這種場景下面堤尾,就需要有一種線程同步機制來處理。通常多線程同步用得最多的就是信號量迁客。不過郭宝,直接使用信號量不但代碼上面相對松散,還會存在懸掛等問題掷漱。GCD已經(jīng)提供了dispatch_group來很好的實現(xiàn)同步問題粘室。
實現(xiàn)方式
在上述場景中,使用dispatch_group
一般流程如下:
- 創(chuàng)建一個group:
dispatch_group_t group = dispatch_group_create();
- 把一個異步操作加入到group中
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
*
*
*
dispatch_group_leave(group);
});
- 等待group完成所有異步操作
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
});
說明:
-
dispatch_group_notify
:當group中所有的block操作都完成后才會執(zhí)行卜范,不會阻塞當前調(diào)用線程衔统,如果需要阻塞當前調(diào)用線程,可使用dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
-
dispatch_group_enter
:增加當前group執(zhí)行block數(shù) -
dispatch_group_leave
:減少當前group執(zhí)行block數(shù)
重點:
-
dispatch_group_enter
與dispatch_group_leave
必須成對出現(xiàn) - ios6.0及以下系統(tǒng)版本需要手動管理dispatch_group對象生命周期海雪,
dispatch_retain
和dispatch_release