GCD group 用法 and 專案實踐

一銘發表於2017-12-13

在dispatch_queue中所有的任務執行完成後在做某種操作,這個需求在專案中非常常見,但是在並行佇列中怎麼處理,尤其是多個網路請求,那就用dispatch_group 成組操作: 專案背景: 一個 tableView 的兩個 section 需要不同網路介面,而且必須要等到兩個網路請求結束後再建立 tableView(類似的需求在專案中不要太多)

//第一步
dispatch_group_t dispatchGroup = dispatch_group_create();
dispatch_group_enter(dispatchGroup);
//enter方法顯示的是group中的任務未執行完畢的任務數目加1,這種方式用在不使用dispatch_group_async來提交任務,要配合使用,有enter要有leave,這樣才能保證功能完整實現。

//第二步
[AFNTool requestWithUrlString:@"xxxxxxx" params:dic success:^(NSDictionary *success) {
      //在這裡處理你的資料, do what you want
      //這裡的 leave 就是配合上面的 enter 來搭配使用
        dispatch_group_leave(dispatchGroup);
    } failure:^(NSError *error) {
        NSLog(@"%@",error);
      //失敗也要 leave, enter和 leave 一定要成對 
        dispatch_group_leave(dispatchGroup);
    }];
複製程式碼

接下來寫第二個網路請求

dispatch_group_enter(dispatchGroup);
[AFNTool requestWithUrlString:@"xxxxxx" params:dict success:^(NSDictionary *success) {
// do something
//配合上面的 enter ,一個 enter 一個 leave
        dispatch_group_leave(dispatchGroup);
    } failure:^(NSError *error) {
        NSLog(@"%@",error);
        dispatch_group_leave(dispatchGroup);
  }];
複製程式碼

為group設定通知一個block,當group關聯的block執行完畢後,就呼叫這個block。


dispatch_group_notify(group, dispatch_get_main_queue(), ^{**
  // 在主執行緒處理 UI
}); 
複製程式碼

大概就是這樣,挺好用的,可以多試試

相關文章