线程通信
// 开启新线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
{
// 耗时操作
}
// 回到主线程
// 1、异步
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新UI
});
// 等同于 [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
// 2、同步
dispatch_sync(dispatch_get_main_queue(), ^{
// 刷新UI
});
// 等同于 [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES];
});
延时操作
// NSObject 延时操作
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
// 2秒后再调用self的run方法
// GCD 延时操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self run];
});
// NSTimer 延时操作
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:NO];
一次&多性操作
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只被执行一次
});
// 多次操作 10
dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
// index 每次遍历的下标 顺序不固定
NSLog(@"-----%ld---", index);
});
队列组
// 创建组
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 任务1
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 任务2
});
// 当 1、2 完成后 再去执行3
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 任务3
});
/**
手动管理group关联的block的运行状态(或计数),进入和退出group次数必须匹配
dispatch_group_enter(group);
dispatch_group_leave(group);
*/