GCD的API

来源:互联网 发布:无极为什么是烂片知乎 编辑:程序博客网 时间:2024/06/02 05:25

Dispatch Queue

dispatch Queue(queue,^{//想执行的任务});

dispatch_queue_create

通过 GCD 的 API 生成 Dispatch Queue.

dispatch_queue_t mySerialDispatchQueue =     dispatch_queue_create("com.xzeroplus.gcd.MySerialDispatchQueue",NULL);

第一个参数线程的名称,第二参数为 Dispatch Queue 的类型,NULL 表示为 Serial Dispatch 。
生成 Concurrent Dispatch Queue 线程则第二个参数为 CONCURRENT_DISPATCH_QUEUE ;

一个 Serial Dispatch 使用一个线程,等待现在执行中处理结束;一个 Concurrent Dispatch Queue 可以使用多个线程,不等待现在执行中的处理结束。

使用 dispatch_release() 释放queue;

Main Dispatch Queue / Global Dispatch Queue

Main Dispatch Queue 是主线程中执行的Dispatch Queue,为Serial Dispatch。

dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();

Global Dispatch Queue 是所有应用程序都能够使用的 Concurrent Dispatch Queue ,有四个优先级。

dispatch_queue_t globalDispatchQueueBackground =         dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);

Dispatch Queue 的种类

名称 种类 说明 Main Dispatch Queue Serial Dispatch Queue 主线程执行 Global Dispatch Queue (High Priority) Concurrent Dispatch Queue 执行优先级:高 Global Dispatch Queue (Default Priority) Concurrent Dispatch Queue 执行优先级:默认 Global Dispatch Queue (Low Priority) Concurrent Dispatch Queue 执行优先级:低 Global Dispatch Queue (Background Priority) Concurrent Dispatch Queue 执行优先级:后台

dispatch_set_target_queue

用 dipatch_queue_create 函数生成的 Dispatch Queue 都是默认优先级的。而使用 dispatch_set_target_queue 可以变更优先级。

dispatch_queue_t mySerialDispatchQueue =         dispatch_queue_create("com.xzeroplus.gcd.MySerialDispatchQueue",NULL); dispatch_queue_t globalDispatchQueueBackground =         dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);dispatch_set_target_queue(mySerialDispatchQueue,globalDispatchQueueBackground);

dispatch_set_target_queue 函数的指定第一个参数的优先级与第二个参数的优先级相同。

dispatch_after

dispatch_after 函数可以指定在一段时间后运行。

指定在3秒后运行

dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW,3ull * NSEC_PER_SEC);dispatch_after(time,dispatch_get_main_queue(),^{    NSLog(@"waited at least three seconds.");});

Dispatch Group

往一个 Serial Dispatch Queue 中加入多个block,会按顺序执行,在最后填加结束处理很容易实现。但是 Concurrent Dispatch Queue 或者多个 Dispatch Queue 同时使用,在最后填加结束处理就颇为麻烦。
这种情况下就可以使用 Dispatch Group 。

dispatch_queue_t queue =     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);dispatch_group_t group = dispatch_group_create();  dispatch_group_async(group,queue,^{NSLog(@"blk0");});dispatch_group_async(group,queue,^{NSLog(@"blk1");});dispatch_group_async(group,queue,^{NSLog(@"blk2");});dispatch_group_notify(group,dispatch_getmain_queue(),^{NSLog(@"done");});dispatch_release(group);

执行顺序

blk1blk2blk0done

前三个顺序不定,但是done一定是在最后输出。

dispatch_group_wait(group,DISPATCH_TIME_FOREVER) 可设置等待时间,DISPATCH_TIME_FOREVER 为永久等待,即是group未执行完则一直等待。
返回值为0和1,0表示执行结束。

dispatch_barrier_async

dispatch_barrier_async 函数回等待追加到 Concurrent Dispatch Queue 上的并行执行的处理全部结束之后,再将指定的处理追加到该 Concurrent Dispatch Queue 中。然后在由 dispatch_barrier_async 函数追加的处理执行完毕后,Concurrent Dispatch 才恢复为一般的动作,然后又开始执行。

dispatch_async(queue,blk0_for_reading);dispatch_async(queue,blk1_for_reading);dispatch_async(queue,blk2_for_reading);dispatch_async(queue,blk3_for_reading); //等待上面的执行完再执行 dispatch_barrier_asyncdispatch_barrier_async(queue,blk_for_writing); //等待 dispatch_barrier_async 执行完再执行下面的dispatch_async(queue,blk4_for_reading);dispatch_async(queue,blk5_for_reading);dispatch_async(queue,blk6_for_reading);dispatch_async(queue,blk7_for_reading);

dispatch_barrier_async追加的处理同时只执行1个。

dispatch_sync

async 是非同步的意思,sync 则是同步的意思。用 dispatch_sync 添加的 Dispatch Queue 会顺序执行,即是在追加Block结束之后,dispatch_sync函数会一直等待。

dispatch_apply

dispatch_apply 函数是 dispatch_sync 和 Dispatch Group的关联 API。该函数按指定的次数将指定的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");

执行顺序

4103526897done

dispatch_apply() 函数第一个参数为重复次数,第二个参数为追加对象 Dispatch Queue ,第三个参数为追加处理。

dispatch_suspend / dispatch_resume

dispatch_suspend用于挂起Dispatch Queue。
dispatch_resume用于恢复Dispatch Queue。

dispatch_suspend(queue);...dispatch_resume(queue);

dispatch_once

dispatch_once函数是保证应用程序执行一次指定处理的API。

static dispatch_once_t pred;dispatch_once (&pred,^{    //初始化});