文档章节

GCD小记

Redding
 Redding
发布于 2014/04/22 11:07
字数 629
阅读 176
收藏 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
【XSY2731】Div 数论 杜教筛 莫比乌斯反演

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

ez_yww
01/16
0
0
BZOJ4028 [HEOI2015]公约数数列 分块

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

Wolf_Reiser
2017/11/19
0
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
0
C语言 -- 递归求最大杏彩源码下载公约数和最小公倍数

递归求杏彩源码下载论坛:haozbbs.com Q1446595067最大公约数和最小公倍数 int gcd(int a, int b) { return a % b ? gcd(b, a % b) : b; } 用辗转相除法求最大公约数,用递归写的代码会比循环...

iuiu230
07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
2
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
4
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部