复习知识点:GCD多线程
GCD的基础
1 #pragma mark - 使用GCD 创建一个 串行 队列 2 // 第一种:系统提供的创建串行队列的方法 3 // 在真正的开发中如果需要创建串行队列,比较习惯用这种 4 // dispatch_queue_t queue = dispatch_get_main_queue(); 5 6 #pragma mark - 使用GCD去创建 并行 队列 7 // 第一种:系统的 8 // 参数1:表示优先级(有四个,没有明显区别) 9 // 参数2:系统保留字 10 // dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 11 12 #pragma mark - 使用GCD并行队列 创建子线程 13 // 参数1:队列名 14 // 参数2:block// dispatch_async(queue, ^{ 15 // NSLog(@"main1 = %@", [NSThread mainThread]); 16 // NSLog(@"current1 = %@", [NSThread currentThread]); 17 // }); 18 // dispatch_async(queue, ^{ 19 // NSLog(@"main2 = %@", [NSThread mainThread]); 20 // NSLog(@"current2 = %@", [NSThread currentThread]); 21 // }); 22 // dispatch_async(queue, ^{ 23 // NSLog(@"main3 = %@", [NSThread mainThread]); 24 // NSLog(@"current3 = %@", [NSThread currentThread]); 25 // }); 26 // 。。。。创建N个 27 28 #pragma mark - 几秒之后去做每一件事 29 // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 30 // NSLog(@"3.0秒的时候"); 31 // }); 32 33 #pragma mark - 重复像一个队列中添加多个任务 34 // dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT); 35 // 第一个参数:添加的数量 36 // 第二个参数:队列 37 // 第三个参数:block 38 // dispatch_apply(100, queue, ^(size_t index) { 39 // NSLog(@"%ld", index); 40 // }); 41 42 #pragma mark - 分组 43 // // 创建一个分组 44 // dispatch_group_t group = dispatch_group_create(); 45 // // 创建一个队列 46 // dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT); 47 // // 创建任务1: 48 // dispatch_group_async(group, queue, ^{ 49 // NSLog(@"i am 1"); 50 // }); 51 // // 创建任务2: 52 // dispatch_group_async(group, queue, ^{ 53 // NSLog(@"i am 2"); 54 // }); 55 // 。。。。创建N个 56 57 // // 用于监听素有的任务执行的情况的 {所以此功能代码必须放在所有任务之后} 58 // dispatch_group_notify(group, queue, ^{ 59 // NSLog(@"i am notify"); 60 // }); 61 62 #pragma mark - 并发中的串行 (披着羊皮的狼) 63 // // 创建的队列串行 64 // // DISPATCH_QUEUE_SERIAL 顺序执行 65 // // DISPATCH_QUEUE_CONCURRENT 无序执行 66 // dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT); 67 // dispatch_async(queue, ^{ 68 // NSLog(@"test 1"); 69 // }); 70 // dispatch_async(queue, ^{ 71 // NSLog(@"test 2"); 72 // }); 73 // 。。。。创建N个
代码展示:
1 #import "ViewController.h" 2 3 @interface ViewController () 4 /// 创建一个imageView 5 @property (nonatomic,strong) UIImageView *imgView; 6 /// 创建一个data用于接收数据 7 @property (nonatomic,strong) NSData *imageData; 8 9 @end 10 11 @implementation ViewController 12 13 - (void)viewDidLoad { 14 [super viewDidLoad]; 15 // Do any additional setup after loading the view, typically from a nib. 16 // 把imageView添加到视图上 17 self.imgView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 18 self.imgView.backgroundColor = [UIColor cyanColor]; 19 [self.view addSubview:self.imgView]; 20 21 [self dataHandle]; 22 } 23 #pragma mark - 解析数据 24 - (void)dataHandle { 25 __weak typeof(self) weakSelf = self; 26 // 创建子线程 在子线程中请求数据 27 dispatch_async(dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT), ^{ 28 NSURL *url = [NSURL URLWithString:@"http://pic.58pic.com/58pic/13/11/15/83b58PICXf4_1024.jpg"]; 29 // 接收数据 30 weakSelf.imageData = [NSData dataWithContentsOfURL:url]; 31 // 返回主线程 刷新UI 32 dispatch_async(dispatch_get_main_queue(), ^{ 33 // 传值 34 weakSelf.imgView.image = [UIImage imageWithData:self.imageData]; 35 }); 36 }); 37 38 } 39 40 @end