GCD的api

1.Dispatch Queue
dispatch_async(queue, ^{
想执行的任务
});

执行处理时存在2种Dispatch Queue,一种是等待现在执行中处理的Serial Dispatch Queue,另一种是不等待现在执行中处理的Concurrent Dispatch Queue。

2.dispatch_queue_create
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create(“com.example.gcd.MySerialDispatchQueue”, NULL);

3.Main Dispatch Queue/Global Dispatch Queue
Main Dispatch Queue主线程中执行的Serial Dispatch Queue
Global Dispatch Queue是所有应用程序都能使用的Concurrent Dispatch Queue
Concurrent Dispatch Queue有4个优先级,分别是高优先级(High Priority)、默认优先级(Default Priority)、低优先级(Low Priority)和后台优先级(Background Priority)

高优先级获取方法
dispatch_queue_t globalDispatchQueueHigh = dispatch_get_global_queue(DISPATHCH_QUEUE_PRIORITY_HIGH, 0);

4.dispatch_set_target_queue
dispatch_queue_create生成的2种Dispatch Queue都是默认优先级
dispatch_set_target_queue(要变更优先级的Dispatch Queue,想变更的同级Dispatch Queue);

5.dispatch_after

6.DIspatch Group
(1)dispatch_group_notify:group中的线程都运行结束执行

dispatch_queue_t queue = dispatch_get_global_queue(DISPATHCH_QUEUE_PRIORITY_Default, 0);
dispatch_group_t group = dispatch_group_creat();

dispatch_group_async(group, queue, ^{NSLog(@“blk0”);});
dispatch_group_async(group, queue, ^{NSLog(@“blk1”);});
dispatch_group_async(group, queue, ^{NSLog(@“blk2”);});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@“done”);});
dispatch_release(group);

(2)dispatch_group_wait:函数的第二个参数指定等待的时间

dispatch_queue_t queue = dispatch_get_global_queue(DISPATHCH_QUEUE_PRIORITY_Default, 0);
dispatch_group_t group = dispatch_group_creat();

dispatch_group_async(group, queue, ^{NSLog(@“blk0”);});
dispatch_group_async(group, queue, ^{NSLog(@“blk1”);});
dispatch_group_async(group, queue, ^{NSLog(@“blk2”);});

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(group);

DISPATCH_TIME_FOREVER意味着永久等待
指定等待时间间隔为1时做如下处理。
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC);
long result = dispatch_group_wait(group ,time);
if (result == 0){
执行结束
}else {
某一个还在执行
}
指定DISPATCH_TIME_NOW不用任何等待即可判定group是否执行结束
long result = dispatch_group_wait(group ,DISPATCH_TIME_NOW);
在主线程的Runloop的每次循环中,可检查是否结束,从而不耗费多余等待时间,但还是推荐使用dispatch_group_notify

7.dispatch_barrier_async
dispatch_barrier_async与dispatch_queue_creat函数生成的oncurrent Dispatch Queue一起使用

dispatch_queue_t queue = dispatch_queue_creat(“com.example.gcd.ForBarrier”,DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, blk0_for_reading);
dispatch_async(queue, blk1_for_reading);
dispatch_async(queue, blk2_for_reading);
dispatch_async(queue, blk3_for_reading);
dispatch_barrier_async(queue, blk_for_waiting);
dispatch_async(queue, blk4_for_reading);
dispatch_async(queue, blk5_for_reading);
dispatch_async(queue, blk6_for_reading);
dispatch_async(queue, blk7_for_reading);

dispatch_barrier_async函数会等追加到Concurrent Dispatch Queue上的并行执行处理全部结束后,再将指定的处理追加到该Concurrent Dispatch Queue中,由dispatch_barrier_async函数追加的处理执行完毕后才恢复为一般的动作
使用Concurrent Dispatch Queue和dispatch_barrier_async可以实现高效率数据库访问和文件访问

8.dispatch_sync
意味着“同步”,也就是将指定的Block“同步”追加到指定的Dispatch Queue中。在追加Block结束之前,dispatch_sync函数会一直等待
等待,意味着当前线程停止。
dispatch_sync可以说是简化版dispatch_group_wait函数,容易引起死锁

dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{NSLog(@“Hello”);});
该源代码在Main Dispatch Queue即主线程中执行指定Block,并等待其执行完毕。但是在主线程中正在执行这些源代码,所以无法执行追加到Main Dispatch Queue的block,
Main Dispatch Queue中执行的Block等待Main Dispatch Queue中要执行的Block执行结束,变为死锁
当然Serial Dispatch Queue也会引起这种问题

9.dispatch_apply
dispatch_apply是dispatch_sync函数和Dispatch Group的关联api,该函数按指定的次数将指定Block追加到指定的Dispatch Queue中,并等待全部处理执行结束
dispatch_queue_t queue = dispatch_get_global_queue(DESPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10,queue, ^(size_t index) {
NSLog(@"%zu", index);
});
NSLog(@“done”);

执行结果为
4
1
0
3
5
2
6
8
9
7
done

因为在Global Dispatch Queue中执行处理,各个处理执行时间不定,但输出结果必然为done,因为dispatch_apply函数会等待全部处理执行结束
第一个参数为重复次数,第二个参数为追加对象的Dispatch Queue,第三个参数为追加的处理
推荐在dispatch函数中非同步执行dispatch_apply函数

10.dispatch_suspend/dispatch_resume
dispatch_suspend函数挂起指定的Dispatch Queue
dispatch_suspend(queue);

dispatch_resume函数恢复指定的Dispatch Queue
dispatch_resume(queue);
对已经执行的没影响,恢复后剩下的也可正常运行

11.Dspatch Semaphore
DIspatch Semaphore是持有计数的信号,该信号是多线程编程中的计数类型信号。计数为0时等待,计数为1或大于1时,减去1而不等待。

dispatch_semaphore_t smaphore = dispatch_semaphroe(1);
参数表示计数初始值。

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait函数等待Dispatch Semaphore的计数值达到大于或等于1。当计数值大于等于1,或者在待机中计数值大于等于1时,对该计数进行减法并从dispatch_semaphore_wait函数返回。第二个参数为等待时间

dispatch_semaphore_wait函数返回0时,可安全地执行需要进行排他控制的处理。该处理结束时通过dispatch_semaphore_signal函数将Dspatch Semaphore的计数值加1.

dispatch_queue_t queue = dispatch_get_global_queue(DESPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//初始值设为1,保证可访问NSMutableArray类对象的线程同时只有1个
dispatch_semaphore_t smaphore = dispatch_semaphroe(1);

NSMutableArray *array = [[NSMutableArray alloc] init];

for (int i = 0; i < 10000; i ++){
dispatch_async(queue, ^{
//一直等待,直到Dspatch Semaphore的计数值达到大于等于1
dispatch_semaphore_wait(semaphore,DISPATHCH_TIME_FOREVER);
//由于Dspatch Semaphore的计数值达到大于等于1,计数值减去1,dispatch_semaphore_wait函数执行返回,此时计数值恒为0,由于可访问NSMutableArray类对象的线程同时只有1个,因此可以安全的进行更新
[array addobject:[NSNumber numberWithInt:i]];
//排他控制结束,所以通过dispatch_semaphore_signal函数计数加1,如果有dispatch_semaphore_wait函数,等待计数增加的线程,由最先等待的线程执行
dispatch_semaphore_signal(semaphore);

});
}

在没有Serial Dispatch Queue和dispatch_barrier_async函数那么大粒度且一部分处理需要进行排他控制情况下,Dspatch Semaphore便可发挥威力。

12.dispatch_once
保证应用程序执行中只执行一次指定处理的API

13.Dispatch I/O
Dispatch I/O和Dispatch Data可以做到一次使用多个线程更快地并列读取

猜你喜欢

转载自blog.csdn.net/xx6109/article/details/83108200
gcd