队列优先级
DISPATCH_QUEUE_PRIORITY_HIGH 2 // 优先级高
DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 优先级中
DISPATCH_QUEUE_PRIORITY_LOW (-2) // 优先级低
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台任务优先级
队列类型
// 串行队列
DISPATCH_QUEUE_SERIAL
// 并发队列
DISPATCH_QUEUE_CONCURRENT
队列创建方式
- 串行队列
// 默认优先级的串行队列
dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);
// 主队列
dispatch_queue_t serialQueue = dispatch_get_main_queue();
- 并行(并发)队列
// 默认优先级的并行队列
dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);
// 全局队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
同步函数和异步函数决定了要不要创建新的线程;
同步函数:在当前线程中执行队列里面的任务,不具备开启线程的能力;
异步函数:在新的线程中执行队列里面的任务,具备开启线程的能力;
串行和并行决定了任务的执行方式
串行:一个任务执行完毕后,再执行下一个任务;
并行:多个任务并行执行;
注意:同步执行队列任务,不管是串行还是并行队列,任务都是顺序执行的;
- 同步执行串行任务(不会创建新线程(在主线程中执行),任务顺序执行)
dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);
/// 任务1
dispatch_sync(serialQueue, ^{
NSLog(@"同步执行串行队列任务1----当前线程:%@", [NSThread currentThread]);
});
/// 任务2
dispatch_sync(serialQueue, ^{
NSLog(@"同步执行串行队列任务2----当前线程:%@", [NSThread currentThread]);
});
- 同步执行串行(主队列)任务(死锁,主线程和主队列互相等待)
dispatch_queue_t mainQueue = dispatch_get_main_queue();
/// 任务1
dispatch_sync(mainQueue, ^{
NSLog(@"同步执行主队列任务1----当前线程:%@", [NSThread currentThread]);
});
/// 任务2
dispatch_sync(mainQueue, ^{
NSLog(@"同步执行主队列任务2----当前线程:%@", [NSThread currentThread]);
});
- 同步执行并发任务(不会创建新线程(在主线程中执行),任务顺序执行)
dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);
/// 任务1
dispatch_sync(conCurrentQueue, ^{
NSLog(@"同步执行并发任务1----当前线程:%@", [NSThread currentThread]);
});
/// 任务2
dispatch_sync(conCurrentQueue, ^{
NSLog(@"同步执行并发任务2----当前线程:%@", [NSThread currentThread]);
});
- 同步执行并发(全局队列)任务(不会创建新线程,任务顺序执行)
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
/// 任务1
dispatch_sync(globalQueue, ^{
NSLog(@"同步执行全局队列任务1----当前线程:%@", [NSThread currentThread]);
});
/// 任务2
dispatch_sync(globalQueue, ^{
NSLog(@"同步执行全局队列任务2----当前线程:%@", [NSThread currentThread]);
});
- 异步执行串行任务(创建新线程,任务顺序执行)
dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);
/// 任务1
dispatch_async(serialQueue, ^{
NSLog(@"异步执行串行队列任务1----当前线程:%@", [NSThread currentThread]);
});
/// 任务2
dispatch_async(serialQueue, ^{
NSLog(@"异步执行串行队列任务2----当前线程:%@", [NSThread currentThread]);
});
- 异步执行串行(主队列)任务(不会创建新线程,任务顺序执行)
dispatch_queue_t mainQueue = dispatch_get_main_queue();
/// 任务1
dispatch_async(mainQueue, ^{
NSLog(@"异步执行主队列任务1----当前线程:%@", [NSThread currentThread]);
});
/// 任务2
dispatch_async(mainQueue, ^{
NSLog(@"异步执行主队列任务2----当前线程:%@", [NSThread currentThread]);
});
- 异步执行并发队列任务(会创建新线程,任务无序执行)
dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);
/// 任务1
dispatch_async(conCurrentQueue, ^{
NSLog(@"异步执行并发队列任务1----当前线程:%@", [NSThread currentThread]);
});
/// 任务2
dispatch_async(conCurrentQueue, ^{
NSLog(@"异步执行并发队列任务2----当前线程:%@", [NSThread currentThread]);
});
- 异步执行并发(全局)队列任务(会创建新线程,任务无序执行)
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
/// 任务1
dispatch_async(globalQueue, ^{
NSLog(@"异步执行全局并发队列任务1----当前线程:%@", [NSThread currentThread]);
});
/// 任务2
dispatch_async(globalQueue, ^{
NSLog(@"异步执行全局并发队列任务2----当前线程:%@", [NSThread currentThread]);
});
网友评论