一,延迟执行
//获取主队列
//dispatch_queue_t queue= dispatch_get_main_queue();
//并发队列
/*
参数1,DISPATCH_TIME_NOW 从现在开始计算时间
参数2,延迟的时间,2秒,GCD的时间单位是纳秒
参数3,队列,当queue为主线程的时候,GCD的block在主线程执行,当queue为并发队列的时候,在子线程执行。
![Uploading 屏幕快照 2017-03-27 上午10.02.49_177411.png . . .]
*/
NSLog(@"%@--延迟---%@",[NSThread currentThread],[NSDate date]);
dispatch_queue_t queue= dispatch_get_global_queue(0, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{
NSLog(@"%@--延迟---%@",[NSThread currentThread],[NSDate date]);
});
打印结果如下图:
二,一次性执行
//一次性:整个应用中只会调用一次
/*onceToken被static修饰。
凡是用static修饰的都是全局变量,代表整个应用程序的生命周期。
当声明了onceToken这个变量,会在内存分配一块空间,用来保存onceToken这个变量。
这个变量永远不会被释放,只有程序结束,才会释放。
*/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"%@--一次性",[NSThread currentThread]);
});
//注意:一次性代码不能放在懒加载里
//懒加载也是只执行一次
三,下载图片
/*
1.创建子线程下载图片
*/
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//1,确定url
NSURL *url = [NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1490442169210&di=f1fce36b60c73a6eb7cae4eb9fe733dd&imgtype=0&src=http%3A%2F%2Fimg15.3lian.com%2F2015%2Ff1%2F191%2Fd%2F24.jpg"];
//2,下载二进制数据到本地
NSData *data = [NSData dataWithContentsOfURL:url];
//转图片
UIImage *image= [UIImage imageWithData:data];
NSLog(@"----%@",[NSThread currentThread] );
//3,更新UI
//这里可以使用同步函数更新,也可以使用异步函数,因为本程序在子线程执行,同步函数在子线程执行不会死锁,在主线程会死锁
// dispatch_async异步函数
// dispatch_async(dispatch_get_main_queue(), ^{
// self.imageView.image = image;
// NSLog(@"--%@",[NSThread currentThread] );
//
// });
//dispatch_sync同步函数,
dispatch_sync(dispatch_get_main_queue(), ^{
self.imageView.image = image;
NSLog(@"--%@",[NSThread currentThread] );
});
});
注意这里,因为使用的是dispatch_get_global_queue(0, 0)开了子线程,可以用同步函数下载图片,如果改为主队列,则会死锁。