標籤:dispatch_group 嵌套 非同步 並行任務
情境1:
從資料來源讀到N個值,然後需要遍曆這N個值,分別發起http請求。處理完成之後,調用一個最終匯總的方法
這個情境如果用js的async架構,很容易就能實現:
async.series([task1, task2, task3], function(err){ // 匯總代碼});function task1(callback){ // http請求 callback(null);}function task2(callback){ // http請求 callback(null);}function task3(callback){ // http請求 callback(null);}
但是在ios裡,就比較麻煩,最後是用dispatch_group實現的:
dispatch_group_t group = dispatch_group_create(); while([rs next]){ dispatch_group_enter(group); [syncService refreshMembersWithEnterpriseId:enterpriseId LatestSyncTime:latestSyncDate Block:^(BOOL flag){ dispatch_group_leave(group); }];} dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 匯總代碼});
情境2:
後來需求變化了,情境更複雜了點。針對每個值,都要發起多個http請求(情境1隻需要請求1次)。所有請求都結束以後,再調用匯總方法
所以一開始我寫成類似這樣:
dispatch_group_t group = dispatch_group_create(); while([rs next]){ dispatch_group_enter(group); dispatch_group_t group_inner = dispatch_group_create(); dispatch_group_enter(group_inner); [syncService refreshMembersWithEnterpriseId:enterpriseId LatestSyncTime:latestSyncDate Block:^(BOOL flag){ dispatch_group_leave(group_inner); }]; dispatch_group_enter(group_inner); [syncService refreshReportsWithEnterpriseId:enterpriseId LatestSyncTime:latestSyncDate Block:^(BOOL flag){ dispatch_group_leave(group_inner); }]; dispatch_group_notify(group_inner, dispatch_get_global_queue(0, 0), ^{ dispatch_group_leave(group); });} dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 匯總代碼});
寫完之後發現,其實在這個情境下,不需要嵌套group,共用一個group也沒問題
dispatch_group_t group = dispatch_group_create(); while([rs next]){ dispatch_group_enter(group); [syncService refreshMembersWithEnterpriseId:enterpriseId LatestSyncTime:contactLatestSync Block:^(BOOL flag){ dispatch_group_leave(group); }]; dispatch_group_enter(group); [syncService refreshReportsWithEnterpriseId:enterpriseId LatestSyncTime:reportLatestSync Block:^(BOOL flag){ dispatch_group_leave(group); }];}dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 匯總代碼});
因為這裡並不需要針對每個組做匯總處理,如果每個組還有自己的匯總邏輯需要執行的話,就需要嵌套group了