Dispatch 执行ABC任务,执行完成之后刷新UI,指定任务D

博客介绍了在Swift中分组管理异步任务的方式,一是通过group enter和leave进行同步管理,二是使用信号量实现,信号量是基于计数器的线程同步机制。

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

在swift中分组管理异步任务的方式

1 group enter 和 leave 进行同步管理

    func method1() {
        //  创建一个组 ,要是在一个控制器中去规划请求顺序,则这个组要是全局的组
        let group = DispatchGroup();
        let queue = DispatchQueue.global();
        
        //
        let imgsArr = ["http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/21.jpg","http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/22.jpg","http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/23.jpg"]
        
        
        for i in 0 ..< imgsArr.count {
            // 每一次循环进入组
            group.enter();
         
            // 进行网络请求
            let session = URLSession.shared;
            
            let task = session.dataTask(with: URL(string: imgsArr[i])!) { (data, response, error) in
                if error == nil {
                    print("第\(i)张图片下载完成");
                    // 离开组
                    group.leave();
                }
            };
            // 执行
            task.resume();
            
        }
        
        // 执行完毕
        // 打印结果
        /* 第2张图片下载完成
        第1张图片下载完成
        第0张图片下载完成
        图片下载完毕
        
        */
        
        // 当组内所有任务都完成之后 出发notify
        group.notify(queue:queue) {
            print("图片下载完毕");
        };
2 使用信号量进行实现

信号量是基于计数器的一种线程同步机制

    func method2() {
     
        //
        let imgsArr = ["http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/111.jpg","http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/112.jpg","http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/113.jpg"]
        
        // 创建一个信号量 默认值为0  每每发送一次 信号量+1
        
        let sem = DispatchSemaphore.init(value: 0);
 
        for i in 0 ..< imgsArr.count {
            
            
            // 进行网络请求
            let session = URLSession.shared;
            
            let task = session.dataTask(with: URL(string: imgsArr[i])!) { (data, response, error) in
                if error == nil {
                    print("第\(i)张图片下载完成");
                    
                    // 请求成功 信号进行+1操作
                    sem.signal()
                }
                
            };
            
            task.resume();
            // 一共创建了三个wait函数
            sem.wait(timeout: DispatchTime.distantFuture);
        }
        
        // 等待所有的wait函数都被释放的时候 任务都完成的时候 信号不为0 程序继续执行
       
        /*
         第0张图片下载完成
         第1张图片下载完成
         第2张图片下载完成
         图片下载完毕
         */
        print("图片下载完毕");
        
        
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值