嵌套的異步回調
阿新 • • 發佈:2017-05-14
pat clas creat eve div gets gcd 異步 api
本意是調用GCD的group API。處理完每一個http請求的響應之後。才運行最後的總任務。可是因為httpHelper的getSecure:completionHandler:方法本身也有一個異步回調。所以上面的代碼失效了
今天被一個問題糾結了2個小時。一開始失敗的代碼大概是這種:
dispatch_group_t group = dispatch_group_create(); while([rs next]){ dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ [httpHelper getSecure:url completionHandler:^(NSDictionary* dict){ // 子任務 }]; }); } dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{ // 子任務所有完畢後。才運行 });
本意是調用GCD的group API。處理完每一個http請求的響應之後。才運行最後的總任務。可是因為httpHelper的getSecure:completionHandler:方法本身也有一個異步回調。所以上面的代碼失效了
或者換一種寫法。把dispatch_group_async寫到getSecure的callback裏面,也不行
最後最終找到一個救命帖:
gcd dispatch groups with an additional level of inception
應該寫成這樣:
dispatch_group_t group = dispatch_group_create(); while([rs next]){ dispatch_group_enter(group); dispatch_async(dispatch_get_global_queue(0, 0), ^{ [httpHelper getSecure:url completionHandler:^(NSDictionary* dict){ // 子任務 dispatch_group_leave(group); }]; }); } dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{ // 子任務所有完畢後。才運行 });
嵌套的異步回調