iOS深入理解GCD 第三篇(dispatch_group_enter和dispatch_group_leave)

一直對dispatch_group_enter(group)、dispatch_group_leave(group)很陌生,最近看了幾篇博客,整理一下權(quán)當(dāng)理解記憶
Calling this function indicates another block has joined the group through
  a means other than dispatch_group_async(). Calls to this function must be
 * balanced with dispatch_group_leave().
調(diào)用這個方法標(biāo)志著一個代碼塊被加入了group,和dispatch_group_async功能類似;
需要和dispatch_group_enter()、dispatch_group_leave()成對出現(xiàn);
void
dispatch_group_enter(dispatch_group_t group);

個人理解:和內(nèi)存管理的引用計數(shù)類似,我們可以認(rèn)為group也持有一個整形變量(只是假設(shè)),當(dāng)調(diào)用enter時計數(shù)加1,調(diào)用leave時計數(shù)減1,當(dāng)計數(shù)為0時會調(diào)用dispatch_group_notify并且dispatch_group_wait會停止等待;

以上內(nèi)容摘自 http://www.itdecent.cn/p/228403206664 作者:liang1991

代碼示例:(取自)http://www.itdecent.cn/p/471469ad9af1 作者:老馬的春天

- (void)test {
    NSURL *url = [NSURL URLWithString:@"http://upload-images.jianshu.io/upload_images/1432482-dcc38746f56a89ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"];

    SDWebImageManager *manager = [SDWebImageManager sharedManager];

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_enter(group);
    [manager loadImageWithURL:url options:SDWebImageRefreshCached progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
        dispatch_group_leave(group);
    }];

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"下載完成了");
    });
}

enter和leave方法必須成對出現(xiàn),如果調(diào)用leave的次數(shù)多于enter就會崩潰,當(dāng)我們使用SD時,如果Options設(shè)置為SDWebImageRefreshCached,那么這個completionBlock至少會調(diào)用兩次,首先返回緩存中的圖片。其次在下載完成后再次調(diào)用Block,這也就是崩潰的原因。

要想重現(xiàn)上邊方法的崩潰,等圖片下載完之后,再從新調(diào)用該方法就行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容