GCD其他实用场景
GCD线程间通信
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSLog(@"开来一个新线程--%@",[NSThread currentThread]);
// 回到主线程显示图片
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"--imageView--%@", [NSThread currentThread]);
self.iconView.backgroundColor = [UIColor redColor];
});
});
GCD组线程
当需要在两个线程的任务执行完后,执行另一个动作,就将这两个线程放到线程组中
// 创建一个组
dispatch_group_t group = dispatch_group_create();
// 开启一个线程 执行费时操作1
__block int num1;
dispatch_group_async(group, global_queue, ^{
NSLog(@"执行费时操作1");
num1 = 30;
});
// 开启一个线程 执行费时操作2
__block int num2;
dispatch_group_async(group, global_queue, ^{
NSLog(@"执行费时操作2");
num2 = 44;
});
// 费时操作1、费时操作2 会同时执行
// 等group中的所有任务都执行完毕, 再回到主线程执行其他操作
dispatch_group_notify(group, main_queue, ^{
NSLog(@"回到主线程敢点活");
NSLog(@"num1 + num2 = %d",num1 + num2);
self.countResult.text = [NSString stringWithFormat:@"%d",num1+ num2];
});
GCD实现延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"这是延迟打印出来的东西,还可以自定义线程哦");
});
GCD实现 代码只执行一次
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"这句代码只会执行一次");
});
}