1. 程式人生 > >嵌套的異步回調

嵌套的異步回調

pat clas creat eve div gets gcd 異步 api

今天被一個問題糾結了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), ^{
    // 子任務所有完畢後。才運行                        
});


嵌套的異步回調