复习知识点:GCD多线程

Posted 不忘初心,方得始终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复习知识点: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

 

以上是关于复习知识点:GCD多线程的主要内容,如果未能解决你的问题,请参考以下文章

iOS-多线程之GCD(原创)

iOS 多线程:『GCD』详尽总结

iOS开发关于GCD多线程方面的知识

线程学习知识点总结

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

iOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步