iOS-GCD的实践

本文探讨了dispatch_group_enter()与dispatch_group_leave()在多线程任务中的使用,并通过示例代码展示了它们如何确保所有子任务按预期顺序完成。此外,还介绍了dispatch_semaphore在控制并发任务数量方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.dispatch_group_enter(),dispatch_group_leave() 的应用

简单来说,它们分别代表进入group和离开group.想想以下代码打印的顺序是多少?

   dispatch_group_t group = dispatch_group_create();
    NSLog(@"1");
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"2");
        dispatch_group_leave(group);
    });
    NSLog(@"3");

    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"4");
        dispatch_group_leave(group);
    });
    NSLog(@"5");
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"6");

    });

正确的打印结果如下图: (1,3,2,5,4,6)
正确的打印结果如下图

2.dispatch_semaphore的应用

设计一个并发数量为n(n>0,为整数)的DEMO

    int n = 5;//假设并发数量为5
    dispatch_group_t group = dispatch_group_create();
    dispatch_semaphore_t sem = dispatch_semaphore_create(n);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for(int i=0 ;i <100;i++){
        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"%i",i);
            sleep(2);
            dispatch_semaphore_signal(sem);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

为了验证结果,抛出证据来:
设计一个并发数量为n的DEMO

3.死锁案例

//用SDWebImage来判断本地是否存在高清图片,运行此代码发现界面控件无法响应事件。
- (BOOL)hasHighQImage{
    __block BOOL hasHighQImage = NO;
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    [manager diskImageExistsForURL:[self highQualityImageURLForIndex:self.currentImageIndex] completion:^(BOOL isInCache) {
        hasHighQImage = isInCache;
        dispatch_semaphore_signal(sem);
    }];
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    return hasHighQImage;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值