博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD调度组实现原理
阅读量:4087 次
发布时间:2019-05-25

本文共 1892 字,大约阅读时间需要 6 分钟。

手动实现调度组

- (void)groupDemo{    // 调度组    dispatch_group_t group = dispatch_group_create();    // 队列    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);    // 下载图片A    // 1.进入调度组 : 给任务做标记    dispatch_group_enter(group);    // 2.让调度组里面的任务异步执行    dispatch_async(queue, ^{        NSLog(@"下载图片A %@",[NSThread currentThread]);        // 3.移出调度组 : 把标记从调度组移出        dispatch_group_leave(group);    });    // 下载图片B    dispatch_group_enter(group);    dispatch_async(queue, ^{        NSLog(@"下载图片B %@",[NSThread currentThread]);        dispatch_group_leave(group);    });    // 下载图片C    dispatch_group_enter(group);    dispatch_async(queue, ^{        NSLog(@"下载图片C %@",[NSThread currentThread]);        dispatch_group_leave(group);    });    // 监听一组异步任务是否执行结束    dispatch_group_notify(group, queue, ^{        NSLog(@"三张图片下载完了 %@",[NSThread currentThread]);    });}

使用GCD调度组监听一组异步任务是否完成

// 使用调度组下载图片 : 演示调度组不是用来解决线程安全问题的 - (void)groupDemo{    // 调度组    dispatch_group_t group = dispatch_group_create();    // 队列    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);    // 循环的使用调度组去异步的下载图片    for (NSInteger i = 0; i < 1000; i++) {        // 调度组异步执行的函数 : 会把每个任务都在group里面做一个标记        dispatch_group_async(group, queue, ^{            // 获取本地图片的全路径            NSString *name = [NSString stringWithFormat:@"%02zd",(i%10)+1];            NSString *filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];            // 获取图片            UIImage *image = [UIImage imageWithContentsOfFile:filePath];            NSLog(@"%@ %@",name,[NSThread currentThread]);            // 图片下载完成之后,需要缓存到沙盒,如果监听到这组异步任务执行结束,就在`dispatch_group_notify`方法里面,刷新UI        });    }    // 一旦一组异步任务执行结束之后,可以得到统一的通知,这个函数默认在子线程执行的    // 这个方法不会循环多次的调用,只会执行一次    dispatch_group_notify(group, queue, ^{        // 一组异步任务执行结束之后的操作,写在这个代码块里面,一般是刷新UI的,需要回到主线程        NSLog(@"1000张图片执行完了? %@",[NSThread currentThread]);    });}

转载地址:http://kfkii.baihongyu.com/

你可能感兴趣的文章
Swift 存储目录
查看>>
Swift Proxy 调用流程(源码剖析)
查看>>
Swift API和Command
查看>>
Swift build(.build)和ring(.gz)的数据结构和文件的持久化机制
查看>>
FastDFS介绍
查看>>
FastDFS设计理念
查看>>
FastDFS特性及问题思考
查看>>
FastDFS 小文件优化策略
查看>>
FastDFS合并存储策略
查看>>
FastDFS Tracker-Leader选择
查看>>
三种存储类型比较-文件、块、对象存储
查看>>
ACID、BASE和CAP原理
查看>>
Dedup概述
查看>>
Erasure Code
查看>>
Erasure Code原理
查看>>
EC---->LRC---->Sparse Erasure Code
查看>>
Linux创建后台进程
查看>>
VoIP协议栈
查看>>
链表笔面问题
查看>>
goahead server Web开发一般步骤
查看>>