GCD
任务
同步(阻塞当前线程)与异步(不会)
队列
串行与并行
//全局并发的队列 参数1:优先级
dispatch_get_global_queue(0,0)
// 如果我们自己创建穿行队列的话 不会另外开辟线程 只在同一条线程中执行 从而控制任务的先后执行顺序
dispatch_queue_t myQueue = dispatch_queue_create("name",NULL);// 串行队列
dispatch_queue_t myQueue = dispatch_queue_create("name",DISPATCH_QUEUE_CONCURRENT);// 并行队列
dispatch_async(dispatch_get_global_queue(0,0),^{、
//执行耗时操作(db image)
[NSThread sleepForTimeInterval:3];
dispatch_async(dispatch_get_main_queue(),^{
//回到主线程刷新UI
});
});
需求 多个任务异步处理之后 统一的回掉通知处理其他任务(维修详情界面的数据请求与UI刷新) 可用到 dispatch_group
dispatch_group_t groupQueue = dispatch_group_create();
dispatch_group_async(group, queue, ^{
1
如果是异步操作的需要放到group中
dispatch_group_enter(groupQueue);
[self request:^{
dispatch_group_leavc(groupQueue);
}];
});
dispatch_group_async(group, queue, ^{
2
});
dispatch_group_async(group, queue, ^{
3
});
//统一的回掉通知
dispatch_group_notify(group, queue, ^{
123任务都执行完的回掉通知 在异步线程中
});
GCD实现单例
static dispatch_once_t onceToken;
static Single *single = nil;
dispatch_once(&onceToken, ^{
single = [[Single alloc] init];
});
return single;
延迟加载
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_i)(2*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
避开动画以及业务等
一定避免执行已经释放的变量
});