GCD的API

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 QueueSerial 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);

执行顺序

blk1
blk2
blk0
done

前三个顺序不定,但是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_async
dispatch_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");

执行顺序

4
1
0
3
5
2
6
8
9
7
done

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,^{
    //初始化
});
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值