dispatch queue概述dispatch queue的优势:与对应的线程代码相比,更加易用; 执行任务时,效率更高。 为dispatch queue定义任务时,只能使用函数或块对象。 所有的dispatch queue都是先进先出的数据结构(到底它还是queue~),因此,添加到dispatch queue中的任务也是按添加的顺序开始执行的。 dispatch queue分类:
关于dispatch queue,需要牢记以下几个关键点:
创建及管理dispatch queue获取global dispatch queue使用dispatch_get_global_queue函数,其第一个参数指定dispatch queue的优先级,取值可以是DISPATCH_QUEUE_PRIORITY_HIGHT、DISPATCH_QUEUE_PRIORITY_DEFAULT、DISPATCH_QUEUE_PRIORITY_LOW或DISPATCH_QUEUE_PRIORITY_BACKGROUND(iOS 5.0加入的); 第二个参数,目前只能为0或NULL。 创建serial dispatch queue
使用dispatch_queue_create函数,第一个参数指定其名称,第二个参数指定其属性,属性是保留给苹果未来用的,当前,应该指定其为NULL。 dispatch queue的内存管理
使用dispatch_retain及dispatch_release函数。不应该保留或释放main
dispatch queue以及任何global 为dispatch queue提供自定义上下文信息使用dispatch_set_context及dispatch_set_context函数。 为dispatch queue提供清理函数可以使用dispatch_set_finalizer_f函数为dispatch queue设置清理函数,当dispatch queue的引用计数达到0时,其所指定的清理函数就会被调用。 为dispatch queue添加任务向一个queue中添加一个单独的任务可以以同步或异步的方式进行添加。四个函数:dispatch_async、dispatch_async_f、dispatch_sync、dispatch_sync_f。千万不要使用dispatch_sync或dispatch_sync_f将同一个dispatch queue中正在执行的任务再次添加到这个queue中,如果这样做,会导致死锁。 并发执行循环迭代使用dispatch_apply或dispatch_apply_f函数。 如果你要使用这两个函数执行类似 1 for (int i = 0; i < 10; i++) {
2 printf("loop-----%i\n", i);
3 }
的任务,可以使用 1 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2 dispatch_apply(10, queue, ^(size_t i) {
3 printf("loop-----%zd\n", i);
4 });
或 1 void loopwork(void *p, size_t i) {
2 printf("loop-----%zd\n", i);
3 }
4
5 - (void)viewDidLoad {
6 [super viewDidLoad];
7 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
8 dispatch_apply_f(10, queue, NULL, loopwork);
9 }
挂起或唤醒dispatch queuedispatch_suspend会挂起dispatch queue,但并不意味着当前正在执行的任务会停下来,这只会导致不再继续执行还未执行的任务。dispatch_resume会唤醒已挂起的dispatch queue。你必须确保它们成对调用。
苹果公司敬告:Migrating Away from Threads。远离NSThread~。执行多线程任务时,要么使用operation queue,要么使用dispatch queue。 |
|
来自: UchihaItachiF > 《ios》