一、队列
分发队列种类:Serial Dispatch Queue(串联)、Concurrent Dispatch Queue(并行)
1.使用用户自己创建的队列
dispatch_queue_t serialQueue=dispatch_queue_create("serial", <strong>DISPATCH_QUEUE_SERIAL</strong>);//
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent",<strong>DISPATCH_QUEUE_CONCURRENT</strong>);
*队列销毁(ios6 之前版本需要掉用),dispatch_release(serialQueue);
*通过dispatch_queue_create创建的队列,其默认级别是DEFAULT。可以通过dispatch_set_target_queue设置优先级。
void dispatch_set_target_queue( dispatch_object_t object, dispatch_queue_t queue);
2.使用系统提供的队列
Main Dispatch Queue:当前主线程,是Serial Dispatch Queue。
dispatch_queue_t mainQueue = dispatch_get_main_queue();
Global Dispatch Queue:所有应用程序都可使用。
dispatch_queue_t globalQueue = dispatch_get_global_queue( dispatch_queue_priority_t,0);
dispatch_queue_priority_t:队列级别,共分为4种
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
二、队列处理
2.1 延后处理:dispatch_after
如:3秒后执行block中代码。 “uul”指“unsigned long long”。
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3ull * NSEC_PER_SEC);//相对时间
dispatch_after(time,dispatch_get_main_queue(),^{...});//
dispatch_walltime//绝对时间
2.2 等待处理(分组):Dispatch Group
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{ ... block 1 });
dispatch_group_async(group,queue,^{ ... block 2 });
dispatch_group_async(group,queue,^{ ... block 3 });
dispatch_group_notify(group,^{... block 4});
执行完代码块1、2、3之后,再执行block 4中的内容。
*dispatch_group_wait 可等待指定时间。
2.3 资源竞争时处理(数据库、文件操作)
使用Serial Dispatch Queue 不存在资源竞争,效率低下
使用Concurrent Dispatch Queue时需使用dispatch_barrier_async
如:执行并列执行完read1、read2、read3 后执行write 1,执行完才执行read 4。
dispatch_async(queue,^{ ... read 1 });
dispatch_async(queue,^{ ... read 2 });
dispatch_async(queue,^{ ... read 3 });
dispatch_barrier_async(queue,^{ ... write 1});
dispatch_async(queue,^{ ... read 4 });
...
2.4 同步、异步 处理
dispatch_async:不等待处理执行结束
dispatch_sync:等待处理执行结束
2.5 暂停、恢复 处理
dispatch_suspend(queue);
dispatch_resume(queue);
2.6 多线程中只执行一次
static dispatch_once_t pred;
dispatch_once(&pred,^{
/*
* 初始化
*/
});
2.7 大文件处理
dispatch io