GCD的解释及原理网上已经有详细的介绍了,这里我就只是把自己项目中常用到的记录下来,如果大家有更多的项目运用,请留言,我会及时学习并摘录进来,让不太喜欢理论而喜欢实际操作的人学到更多。
1、耗时操作
场景:(1)耗时操作:数据量比较大,而我们不可能一直等数据请求完再来刷新UI
(2)增量更新:先加载本地数据,再请求接口是否有更新,如果有更新,请求数据后再回到主线程更新UI,同时更新数据库
(3)。。。。。。
/**
* 解决耗时操作 - UI + 数据请求
*/
-(void)demo1
{
NSLog(@"star");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//这里操作耗时的任务 不管block是否运行结束,都不会阻塞UI线程
for (NSInteger i = 0; i < 10; i ++) {
NSLog(@"你好");
}
// dispatch_async会向dispatch_get_global_queue全局队列去添加新的任务
//网络请求
//加载网络图片
//数据解析
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"执行完了 - 刷新主线程");
});
});
NSLog(@"end");
}
2、多个接口操作
场景:(1)接口过多:现在一个接口越来越不能满足一个界面的需求,通常需要多个接口来管理一个界面的UI(增量更新同样可以用到)
(2)。。。。
/**
* 多个耗时操作异步执行 - 再去刷新UI
*/
-(void)demo2
{
NSLog(@"star");
//线程
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建分组
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
for (NSInteger i = 0; i < 10; i ++) {
NSLog(@"数据请求1");
}
});
dispatch_group_async(group, queue, ^{
for (NSInteger i = 0; i < 10; i ++) {
NSLog(@"数据请求2");
}
});
/**
* 回到主线程
*/
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"刷新UI");
});
NSLog(@"end");
}