- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // [self downImage]; // [self delay]; [self once]; [self once]; [self once]; } /** 一次性代码: 整个应用程序只会执行一次 不可以放在懒加载里面, 如果在类中使用一次性代码, 创建的第二个对象, 就完全不会初始化, static : 全局变量 */ -(void)once{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"---once---"); }); } /** 常用函数 : 延迟方法 */ -(void)delay{ NSLog(@"----start----"); /** 参数1:(nonnull SEL) 方法名字 参数2:(nullable id) 传递参数 参数3:(NSTimeInterval) 时间 */ //1. 只在主线程执行 [self performSelector:@selector(task) withObject:nil afterDelay:2]; //2.定时器方法 只在主线程执行 [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task ) userInfo:nil repeats:YES]; //3.GCD 可以在主线程和子线程执行 /** 参数1:DISPATCH_TIME_NOW 现在开始计算时间 参数2:延迟时间 2.0 GCD 时间单位:纳秒 NSEC_PER_SEC 1000000000ull 参数3:(NSTimeInterval) 时间 */ // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // [self task]; // }); dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{ [self task]; }); dispatch_queue_t global_queue = dispatch_get_global_queue(0, 0); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), global_queue, ^{ [self task]; }); } - (void)task{ NSLog(@"---task---%@", [NSThread currentThread]); } //线程间通讯 - 各种嵌套 -(void)downImage{ //1. 创建异步函数, 这里只有一个任务,用并发和串行都可以 // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // // }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ //1.1确定URL NSURL *url = [NSURL URLWithString:@"http://www.leawo.cn/attachment/201309/4/756352_1378261981fNNT.png"]; //1.2下载二进制数据到本地 NSData *data = [NSData dataWithContentsOfURL:url]; //1.3转换图片 UIImage *image = [UIImage imageWithData:data]; // [self.iv performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; // [self.iv performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO]; // dispatch_async(dispatch_get_main_queue(), ^{ // NSLog(@"=====%@", [NSThread currentThread]); // self.iv.image = image; // }); //这里不会死锁, 因为这个任务是在子线程里 创建的, dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"=====%@", [NSThread currentThread]); self.iv.image = image; }); }); }