今天分享的关于GCD的知识, 对于GCD的说明: 开发者要做的知识定义想要执行的任务并对家到适当的Dispatch Queue中.
Dispatch Queue的种类 | 说明 |
---|---|
Serial Dispatch Queue | 等待现在执行中处理结束 |
Concurrent Dispatch Queue | 不等待现在执行中处理结束 |
Serial Dispatch Queue 使用一个线程
Concurrent Dispatch Queue 使用多个线程
dispatch_queue_create
/** 第一个参数指定, 线程的名称: 可以给NULL 该名称会出现在应用程序崩溃时所生成的CrashLog中, 所以最好给上名称 第二个参数指定, NULL(Serial Dispatch Queue), 或者 Concurrent Dispatch Queue. */
// dispatch_queue_t 代表线程类型
dispatch_queue_t queue = dispatch_queue_create("my.gcd.example", NULL);
Main Dispatch Queue 像他的名字含有Main一样, 是在主线程中执行的Dispatch Queue因为主线程只有一个, 所以他是Serial Dispatch Queue
Global Dispatch Queue 是所有是所有应用程序都能使用的Concurrent Dispatch Queue.
Global Dispatch Queue 有四个优先级别: High, Default, Low, Background(后台)
各种Dispatch Queue 获取方法如下
// man
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// global
// DISPATCH_QUEUE_PRIORITY_HIGH
// DISPATCH_QUEUE_PRIORITY_DEFAULT
// DISPATCH_QUEUE_PRIORITY_LOW
// DISPATCH_QUEUE_PRIORITY_BACKGROUND
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
经常会有这样的情况, 想在3秒之后执行处理 可能不限于3秒, 使用dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// do you something
});
在追加到Dispatch Queue中的多个处理全部结束后想执行结束处理, 这种应该如何处理呢?? 使用 group
假设你想, 追加3个Block 到Global Dispatch Queue 这些Block全部执行完, 执行 Main Dispatch 中结束处理用的Block
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
//
NSLog(@"-------------1");
});
dispatch_group_async(group, queue, ^{
//
NSLog(@"-------------2");
});
dispatch_group_async(group, queue, ^{
//
NSLog(@"-------------3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"-------------4");
});
// 2016-05-08 02:02:56.376 GCD-01[3223:59296] -------------1
// 2016-05-08 02:02:56.376 GCD-01[3223:59298] -------------3
// 2016-05-08 02:02:56.376 GCD-01[3223:59297] -------------2
// 2016-05-08 02:02:56.385 GCD-01[3223:59213] -------------4
因为多个线程并行执行 所以追加的处理执行的顺序是不确定的, 但是4 一定是最后执行.
无论向什么样的 Dispatch Queue 中追加处理, 使用Dispatch Group 都可以监视这些处理的结束, 一旦所有的都结束执行, 就可以加结束的处理追加到Dispatch Queue, 这就是Gourp的奥义.
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // 永久等待
// 具体使用代码如下
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
//
NSLog(@"-------------1");
});
dispatch_group_async(group, queue, ^{
//
for (int i = 0; i < 2000; i ++) {
NSLog(@"%d", i);
}
NSLog(@"-------------2");
});
dispatch_group_async(group, queue, ^{
//
NSLog(@"-------------3");
});
dispatch_time_t time1 = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);
long result = dispatch_group_wait(group, time1);
if (result == 0) {
NSLog(@"全部处理结束");
}else{
NSLog(@"还在处理中");
}
// 2016-05-08 02:19:16.102 GCD-01[3376:65810] 1222
// 2016-05-08 02:19:16.102 GCD-01[3376:65742] 还在处理中
// 2016-05-08 02:19:16.103 GCD-01[3376:65810] 1223
今天先到这里 每天进步一点也是收获, 看到这里请点赞喔 0.O
原文链接