并发
很多人同时排队买火车票
并行
火车站有5个窗口同时卖票
dispatch_set_target_queue
变更生成的Dispatch Queue的执行优先级
dispatch_set_target_queue(queue1,queue2);
queue1:指定要变更优先级的queue
queue2:指定queue1与queue2使用相同优先级
第一个参数如果指定为系统提供的 Main Dispatch Queue 则不知道会发生什么。因此不可指定。
如果在多个 Serial Dispatch Queue 中用dispatch_set_target_queue函数指定目标为某一 Serial Dispatch Queue,那么原本应并行执行的多个 Serial Dispatch Queue 同时只能执行一个
dispatch_after
3秒后执行
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC); // 3秒
//dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_MSEC); // 3毫秒
dispatch_after(time, dispatch_get_main_queue(), ^{
});
Dispatch Group
dispatch_barrier_async
dispatch_sync
dispatch_apply
按指定的次数将指定的block追加到指定的 Dispatch Queue 中,并等全部处理执行结束。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"%zu",index);
});
NSLog(@"done");
0
2
1
4
5
6
7
8
9
3
done
dispatch_suspend / dispatch_resume
挂起指定的 Dispatch Queue
dispatch_suspend(queue);
恢复指定的 Dispatch Queue
dispatch_resume(queue);
这两个方法对已经执行的处理没有影响。挂起后,追加到 Dispatch Queue 中但尚未执行的处理会被挂起,
Dispatch Semaphore
Dispatch Semaphore 是持有计数的信号,该计数是多线程编程中的计数类型信号。所谓信号,类似于过马路时常用的手旗,可以通过时举起手旗,不可通过时放下手旗。而在 Dispatch Semaphore中,使用计数来实现该功能。计数为0时等待,计数为1或大于1时,减去1而不等待。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/*
* Dispatch Semaphore 的计数初始值设定为 1
* 保证访问 NSMutableArray 类对象的线程同时只有一个
*/
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i=0; i<10; ++i) {
dispatch_async(queue, ^{
/*
* 等待 Dispatch Semaphore
* 一直等待,直到 Dispatch Semaphore 的计数值达到大于等于1
*/
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
/*
* 由于semaphore的初始值为1,达到dispatch_semaphore_wait的执行条件
* 将semaphore的计数减一 semaphore计数=0
*/
[array addObject:[NSNumber numberWithInt:i]];
/*
* 排他控制处理结束
* 将semaphore计数加一 semaphore计数=1
* 达到dispatch_semaphore_wait的执行条件
* 由最先等待的线程执行
*/
dispatch_semaphore_signal(semaphore);
});
}