首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
移动开发
> 详细
ios多线程操作(八)—— GCD调度组
时间:
2016-04-16 19:02:47
阅读:
206
评论:
0
收藏:
0
[点我收藏+]
标签:
有这么一个需要,分别执行2个耗时的异步操作,等2个异步操作都执行完毕后在回到主线程执行操作。如果想要快速高效地实现这个需求,可以考虑使用调度组。
调度组的创建代码如下:
[objc]
view plain
copy
dispatch_group_t group = dispatch_group_create();
往调度组里面添加任务的函数如下:
[objc]
view plain
copy
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(
void
)block)
第一个参数group是一个调度组,queue是一个异步队列,这里如果使用同步队列意义就不大了,不过还是能达到效果,第三个参数是一个执行代码块,任务都添加到该代码块里面。
往调度组里面添加任务并获得通知的代码如下:
[objc]
view plain
copy
// 群组-统一监控一组任务
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(
0
,
0
);
// 添加任务
// group 负责监控任务,queue 负责调度任务
dispatch_group_async(group, q, ^{
[NSThread
sleepForTimeInterval
:
1
.0
];
NSLog(
@"任务1 %@"
, [NSThread
currentThread
]);
});
dispatch_group_async(group, q, ^{
NSLog(
@"任务2 %@"
, [NSThread
currentThread
]);
});
dispatch_group_async(group, q, ^{
NSLog(
@"任务3 %@"
, [NSThread
currentThread
]);
});
// 监听所有任务完成 - 等到 group 中的所有任务执行完毕后,"由队列调度 block 中的任务异步执行!"
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 修改为主队列,后台批量下载,结束后,主线程统一更新UI
NSLog(
@"OK %@"
, [NSThread
currentThread
]);
});
NSLog(
@"come here"
);
代码的执行结果如下:
其中任务的下载顺序以及
"come here
”
出现的地方不确定,但主线程的更新操作总会在最后才执行!
GCD调度组中还有一个添加任务的函数:
dispatch_group_enter(dispatch_group_t group)
dispatch_group_leave(dispatch_group_t group)
这两个函数要配对出现
例如:
[objc]
view plain
copy
// 群组-统一监控一组任务
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(
0
,
0
);
// 1> 入组 -> 之后的 block 会被 group 监听
// dispatch_group_enter 一定和 dispatch_group_leave 要配对出现
dispatch_group_enter(group);
dispatch_async(q, ^{
NSLog(
@"task1 %@"
, [NSThread
currentThread
]);
// block 的末尾,所有任务执行完毕后,添加一个出组
dispatch_group_leave(group);
});
// 再次入组
dispatch_group_enter(group);
dispatch_async(q, ^{
[NSThread
sleepForTimeInterval
:
1
.0
];
NSLog(
@"task2 %@"
, [NSThread
currentThread
]);
// block 的末尾,所有任务执行完毕后,添加一个出组
dispatch_group_leave(group);
});
// 群组结束
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(
@"OVER"
);
});
NSLog(
@"come here"
);
代码执行的效果与刚才那种方式相同!
GCD中还有一个函数
[objc]
view plain
copy
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout)
该函数是个阻塞式的等待,当我们将第二个参数设置为
DISPATCH_TIME_FOREVER时,
群组任务不执行完,后续代码就会无法执行,也就是说只要任务不执行完
come here
就不会打印。
ios多线程操作(八)—— GCD调度组
标签:
原文地址:http://blog.csdn.net/wuwuweiweilonglong/article/details/51167210
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
关闭苹果IOS app自动更新
2021-07-29
开发一个即时通讯App
2021-07-28
iOS 跳转App Store进行评分
2021-07-26
诺基亚短信生成!太好玩了
2021-07-26
【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn
2021-07-26
Android系统编程入门系列之界面Activity响应丝滑的传统动画
2021-07-26
uniapp h5,app两端复制文本
2021-07-22
uni-app滚动视图容器(scroll-view)之监听上拉事件
2021-07-21
新型横向移动工具原理分析、代码分析、优缺点以及检测方案
2021-07-19
Android系统编程入门系列之界面Activity交互响应
2021-07-19
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!