创建队列
- dispatch_queue_create("我是串行队列",DISPATCH_QUEUE_SERIAL); 异步执行时会另起一个线程执行该列队
- dispatch_queue_create("我是并行队列",DISPATCH_QUEUE_CONCURRENT);异步执行时会另起多个线程同时执行列队中的多个任务
串行队列遵循FIFO先入先出的原则
注意:dispatch_async($queue,$block)并不是立马另起线程执行,而是把任务加入$queue列队,$queue另起线程的执行时间是随机的不与主线程冲突
尽量避免使用dispatch_sync,避免造成线程阻死,当派发任务到当前执行该dispatch_sync线程时会发生阻死,
dispatch_sync(dispatch_get_main_queue(), ^{ });
- dispatch_get_main_queue()获取主线程列队 主要用于UI刷新 通常不用于计算
- dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)使用缺省值获取全局的并发列队
使用只写锁dispatch_barrier_async($自定义的并行列队,$block)
- 当异步派发多个任务到自定义的并行列队时 使用dispatch_barrier_async会阻死当前列队 等待在它之前加入列队的任务完成后执行该任务 等待该任务执行完成后执行后面的任务
- 注意:仅有自己创建的dispatch_queue_create("我是并行队列",DISPATCH_QUEUE_CONCURRENT)才有效 否则则与dispatch_async一样
快速迭代
//在某个列队执行10次任务 如果是串行列队则添加10个任务到改列队 如果是并行列队则开启10个线程分别执行这10个任务
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"%zu",index);
});
网友评论