文档章节

GCD小记

Redding
 Redding
发布于 2014/04/22 11:07
字数 629
阅读 180
收藏 1
GCD

1.dispatch_async

适用场景:后台异步执行一些耗时任务,或后台任务完成后更新UI,

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue


2.dispatch_after

适用场景:延时执行任务,使用起来就像延时的dispatch_async。既不能控制任务的准确开始执行时间,一旦dispatch_after返回后,也不能取消任务。

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue

示例:double delayInSeconds = 1.0;

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 

        //task

    });


3.dispatch_once

适用场景:线程安全的执行且仅执行一次代码,常用来确保生成单例

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue

示例:+ (instancetype)sharedInstance  

{

    static id *sharedInstance = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        sharedInstance = [[self alloc] init];

    });

    return sharedInstance;

}


4.dispatch barriers

适用场景:一组用于在并发队列中实现串行访问的函数,可用于实现读写锁。使用dispatch barriers函数可以保证在某个队列的某个特定时间,只有唯一一个任务运行。GCD提供了同步和异步两种 barrier函数。

适用队列:Global Concurrent Queue,Custom Concurrent Queue

示例:dispatch_barrier_async(self.concurrentPhotoQueue, ^{

//task

            dispatch_async(dispatch_get_main_queue(), ^{

                //update UI 

            });

        });

        

5.dispatch_sync

适用场景:同步执行任务

适用队列:Main Queue (Serial),Concurrent Queue


6.dispatch groups

适用场景:dispatch groups可以在一组任务完成之后通知用户。这些任务可以是同步的,也可以是异步的,甚至可以处在不同的队列之中。dispatch groups任务完成之后的通知方式有同步和异步两种,可以通过dispatch_group_t引用跟踪管理不同队列中的任务。

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue

示例:

同步通知方式- dispatch_group_t downloadGroup = dispatch_group_create();


dispatch_group_enter(downloadGroup);

//task

dispatch_group_leave(downloadGroup);

...

dispatch_group_wait(downloadGroup, DISPATCH_TIME_FOREVER);

        dispatch_async(dispatch_get_main_queue(), ^{

            if (completionBlock) {

                completionBlock(error);

            }

        });

       

异步通知方式- dispatch_group_t downloadGroup = dispatch_group_create();


dispatch_group_enter(downloadGroup);

//task

dispatch_group_leave(downloadGroup);

...

dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{

        if (completionBlock) {

            completionBlock(error);

        }

    });

   

7.dispatch_apply

适用场景:dispatch_apply功能与for循环一致,不同之处在于dispatch_apply可以并发执行多个循环。dispatch_apply是同步函数,因此与for循环一样,只有所以循环全部完成后才会返回。

适用队列:Concurrent Queue

示例:dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {

 

        switch (i) {

            case 0:

            

                break;

            case 1:

                

                break;

            case 2:

                

                break;

            default:

                break;

        }

    });

    

8.dispatch semaphore

适用场景:使用semaphore可以控制在资源有限的情况下,同时访问资源的消费者数量。可以用来阻塞线程。

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue

示例:dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

  //task

     dispatch_semaphore_signal(semaphore);

 

    dispatch_time_t timeoutTime = dispatch_time(DISPATCH_TIME_NOW, kDefaultTimeoutLengthInNanoSeconds);

    if (dispatch_semaphore_wait(semaphore, timeoutTime)) {

    }


9.dispatch source

不常用。。。


© 著作权归作者所有

共有 人打赏支持
Redding
粉丝 14
博文 49
码字总数 22869
作品 0
南京
程序员
私信 提问
【XSY2523】神社闭店之日 莫比乌斯反演

题目大意   给你 每次给你 ,求有多少个序列满足:长度 ,每个元素是 ,循环右移 次后和原序列相同。    题解   显然只有右移 次后和原序列相同才满足条件。   先求出   枚举长度 ...

ez_yww
2017/12/19
0
0
BZOJ 3202 [Sdoi2013]项链

版权声明:本文为博主原创文章,未经博主允许可以转载,但要注明出处 https://blog.csdn.net/wang3312362136/article/details/85676861 题目链接 https://lydsy.com/JudgeOnline/problem.ph...

wang3312362136
01/03
0
0
【XSY2731】Div 数论 杜教筛 莫比乌斯反演

题目大意   定义复数 为整数 的约数,当且仅当 和 为整数且存在整数 和 满足 。   定义复数 的实部为 ,虚部为 。   定义 为整数 的所有实部大于 的约数的实部之和。   给定正整数 ...

ez_yww
2018/01/16
0
0
BZOJ 3309 DZY Loves Math

版权声明:本文为博主原创文章,未经博主允许可以转载,但要注明出处 https://blog.csdn.net/wang3312362136/article/details/85677742 题目链接 https://lydsy.com/JudgeOnline/problem.ph...

wang3312362136
01/03
0
0
BZOJ4028 [HEOI2015]公约数数列 分块

给定一个数列,要求资磁以下两种操作: 1.单点修改. 2.求数列中最前的位置p,使前缀最大公约数gcd*前缀异或和xor==一个输入的数x. 考虑分块+暴力. 按照分块,求出每一块的前缀gcd和前缀xor. ...

Wolf_Reiser
2017/11/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JFinal开发的旅游线路营销Saas平台演示系统我部署了一个

今天部署了一个旅游线路营销管理系统的演示版: 演示地址:http://lvyou.jfinalxueyuan.com 演示账号:(暂时只给一个门店版的吧,批发商和总部的如果需要 演示看看 单独联系我微信:1876673...

山东-小木
今天
2
0
如何学习大数据技术

学习大数据技术,首先要明确大数据的概念。 大数据的概念作者认为有如下几点: 1.数据的来源多样性。例如关系数据库+文本+excel等 2.数据量大。TB级别的数据。 3.业务应用领域。实时性高与实...

董黎明
今天
3
0
开箱即用(out-of-box)的Redis序列号生成器,不用再写任何代码,你值得拥有

先看整体效果 把简单的东西“傻瓜化”是软件开发追求的目标之一。请看下图: 左边是在 application.yml 里配置了3个生成器,右边可以直接注入到代码中使用,注意,不用写任何代码。这酸爽。 ...

花漾年华
今天
1
0
算法我也不知道有没有下一个---一个题目的开端(索引堆与图)

病痛了一周,折磨来折磨去,终于还是平静了下来,现在能把上周末"贯穿"学到的最后一个基础数据结构的知识给沉淀沉淀了。也是即将再单位分享的东西:图论。这东西,想当年大二,学校的时候,只...

心中的理想乡
今天
1
0
Synchronized和Lock的区别

锁类型: 可重入锁:在执行对象中所有的同步方法时,不必再次去获取锁 可中断锁:在等待获取锁过程中可中断 读写锁:对线程的读写分为两个部分,读过程中多线程可一起访问readLock,写过程中...

最胖的瘦子
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部