/**
队列的类型只决定任务是并发还是串行执行,不影响同步还是异步;
决定同步还是异步,还要看函数名称,dispatch_asynch代表异步,dispatch_synch代表同步;
GCD需要执行数据 必须要加入到队列中,
串行队列 是自己创建的 dispatch_queue_t queue = dispatch_queue_create("hello queue", NULL);
并行队列 用于多核多任务 单任务也可使用 dispatch_queue_t queue =
优先级 默认为0
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
队列执行任务的时候还分异步&同步; 把任务 加入到队列 执行的代码
异步执行队列任务 dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
同步执行队列任务 dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
异步线程中有一个主线程,也有一个异步线程(第一个异步线程需要一个队列容器),子异步线程中的队列就是主线程。可以吧子异步线程中的数据在返回给主线程中;
建议:
一般只需要显示一个地方的话可以自己创建队列, 使用异步同步都可以
dispatch_queue_t queue = dispatch_queue_create("hello queue", NULL);
如果显示数据比较多,需要提高效率可以使用并行队列 建议使用异步
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
如果使用了ARC那么 创建队列&组 就不需要release了;
如果没有使用ARC 创建队列 & 组 的话需要释放,release,当创建了一个对象比如alloc new copy 都需要release;
*/
- (void)viewDidLoad
{
[super viewDidLoad];
[self groupAsync];
}
//异步获取数据,把数据装入组中再把组中数据放入主线程
- (void)groupAsync
{
int a = 2;
int b = 3;
__block int c;
__block int d;
//使用并发队列 优先级 默认的
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//异步 使用队列
dispatch_sync(queue, ^{
//创建组 容器 创建组
dispatch_group_t group = dispatch_group_create(); //创建了组后需要手动释放的;
//容器组中的子异步
dispatch_group_async(group, queue, ^{
c = a + b;
});
//容器组中的子异步
dispatch_group_async(group, queue, ^{
d = a * b;
});
//主线程 创建主线程
dispatch_queue_t main = dispatch_get_main_queue();
//从组中获取数据放入主线程中
dispatch_group_async(group, main, ^{
int e = c + d;
NSLog(@"%i",e);
// dispatch_release(group); 手动释放组;
});
});
}
//异步获取数据返回到主线程中
- (void)asynch
{
//串行队列 一个进程任务中只能有一个线程 内容,默认null
dispatch_queue_t queue = dispatch_queue_create("hello queue", NULL);//串行 自己创建需要自己释放;
//并发队列 一个进程任务中可以有多个线程 获取一个全局队列 优先级,默认0;
// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//循环执行 10次, 在队列中 变量
//异步线程 一个锁对多把钥匙
dispatch_async(queue, ^{
//主线程 创建主线程
dispatch_queue_t main = dispatch_get_main_queue();
//相当于遍历1-10的数据
dispatch_apply(10, main, ^(size_t i) {
NSLog(@"%zu",i);
});
});
// dispatch_release(queue); 需要手动释放
}
gcd 异步操作 比如网络请求刷新界面数据
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[PLNewRequestCenter shareRequestCenter] plsendRequest:param setOpt:PLgetProgramCollection setSuccessBlock:^(NSDictionary *dic) {
NSLog(@"errCode:%@",[dic objectForKey:@"errCode"]);
dispatch_async(dispatch_get_main_queue(), ^{
if ([[dic objectForKey:@"errCode"] integerValue] == 0) {
if ([[dic objectForKey:@"resultData"] count] > 0) {
[rightButton1 setBackgroundImage:[UIImage imageNamed:@"节目详情收藏过.png"] forState:UIControlStateNormal];
}
}else{
[rightButton1 setBackgroundImage:[UIImage imageNamed:@"节目详情收藏按钮.png"] forState:UIControlStateNormal];
}
});
} setFailBlock:^(NSDictionary *dic) {
}];
});