文档章节

GCD小记

Redding
 Redding
发布于 2014/04/22 11:07
字数 629
阅读 171
收藏 1
点赞 0
评论 0
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

【XSY2731】Div 数论 杜教筛 莫比乌斯反演

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

ez_yww ⋅ 01/16 ⋅ 0

BZOJ4028 [HEOI2015]公约数数列 分块

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

Wolf_Reiser ⋅ 2017/11/19 ⋅ 0

欧里几德及扩展欧里几德算法

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。 第一种证明: ...

angel_kitty ⋅ 2017/02/19 ⋅ 0

iOS OS X 和 iOS 中的多线程技术-4 (GCD)

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、GCD GCD(Grand Central Dispatch)是 Apple 公司为了提高 OS X 和 iOS 系统在多核处理器上运行并行代码的能力而开发的一系列相关技术,它...

石虎132 ⋅ 2017/12/03 ⋅ 0

用模板静态计算出最大公因子 (几何画板开发笔记 一)

问题提出: 在开发 C++ 版几何图形系统中, 需要求出两个数字的最大公因子, 算法用 C 语言可写出为: int gcd (int x, int y) { if (y == 0) return x; else if (x > y) return gcd (y, x % y);...

刘军兴 ⋅ 2014/05/02 ⋅ 0

iOS GCD~performSelector、dispatch_once、NSOperation总结

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、使用GCD 替代 performSelector 系列方法 NSObject 的 performSelector 系列方法有很多限制。传给要执行的方法的参数的数量是有限制的,也没...

石虎132 ⋅ 2017/12/05 ⋅ 0

扩展欧几里得

转自:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。 基本算法:设a=qb+r,其中a,b,...

xtestw ⋅ 2014/01/21 ⋅ 0

数论——(扩展)欧几里得算法辨析

欧几里得算法 欧几里得算法链接:传送门 欧几里得算法就是我们通常说的“辗转相除法” 扩展欧几里得 扩展欧几里得是用来求:已知 时,求解一组 ,使得 。 (根据裴蜀等式,一定存在整数解:裴...

qq_39670434 ⋅ 2017/12/12 ⋅ 0

GCD介绍(一): 基本概念和Dispatch Queue

什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务...

于赟 ⋅ 2012/11/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 58分钟前 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部