文档章节

GCD队列

iossocket
 iossocket
发布于 2015/06/21 11:00
字数 992
阅读 66
收藏 0
点赞 0
评论 0

Queues队列

    GCD提供了dispatch queues来处理我们提交给该该队列的任务,并使用了FIFO(先进先出)的方式来处理任务,可使第一个提交的任务第一个开始执行,第二个提交的任务,第二个开始执行,以此类推。串行和并发都是如此。

    队列可被分为串行队列和并发队列。其中串行队列,一次只执行一个任务,当此任务完成时,开始执行下一个任务;而并发队列,可实现多个任务同时在执行(此行为的实现方式也取决于CPU核数,对于单核CPU则是通过时间片的方式切换执行多任务)。

队列类型

    系统为我们提供了两种队列。其一,主队列,这是一种特殊的串行队列,此队列的任务均执行在主线程上,而主线程是唯一可更新UI的线程;其二,全局队列,它又可又优先级(backgroud、low、default、hight)的不同分为4种队列。系统也会使用这些队列,因此这些队列中也将会存在系统任务。

    另外,我们可以使用自定义队列,如何选择何时应选用这三种队列呢?

    主队列:当我们需要更新UI时,只能选用主队列。

    并发队列:当我们需要在后台执行一些和UI无关的工作时。 参考如下代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // do something which do not relate to UI
    dispatch_async(dispatch_get_main_queue(), ^{
        // do something related to UI
    });
});

    自定义队列:当我们想在后台执行一系列工作,并想要跟踪这些工作的状态时,应选用自定义串行队列,它可以有效避免资源争用。创建自定义队列时使用方法dispatch_queue_create方法,第一个参数为一个字符串,对该队列进行标示,第二个参数为该队列的类型可以指定为串行队列DISPATCH_QUEUE_SERIAL,或并发队列DISPATCH_QUEUE_CONCURRENT。当设置为NULL时默认为串行队列。

dispatch_queue_t myQueue = dispatch_queue_create("com.iossocket", NULL);

dispatch_async(myQueue, ^{
    // do something
})

dispatch_release(myQueue);

在我们创建队列时,为队列起一个具有标示意义的标签,可以方便我们的调试。

当iOS版本低于6.0时,需要自己管理GCD对象。当高于6.0时ARC已经替我们管理了GCD对象,无需手动release它。


dispatch方法

1. 异步后台执行异步队列

dispatch_async(dispatch_get_global_queue(0,0), ^{
    // do sth...
});

2. 异步执行UI操作

dispatch_async(dispatch_get_main_queue(), ^{
    // do sth...
});

3. 执行一次性任务,可在创建单例时使用。

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    // this code just be executed once...
});

    当在单例中使用时:(要onceToken设置为static,或具有全局作用域)

+ (instancetype)single { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
        single = [[MySingle alloc] init]; 
    }); 
    return single; 
}

4. 延时执行

double delayTime = 3.0;
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delayTime * NSEC_PER_SEC);
dispatch_after(delay, dispatch_get_main_queue(), ^{
   // after 3 seconds, these code will be executed...
});

5. 重复任务

dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
    sleep(5);
    NSLog(@"no..%zu", index);
});

使用dispatch_apply提交的任务,将阻塞主线程,既是被提交到全局并发队列中,通过上述代码的sleep(5)中可以发现。可通过如下方式来避免阻塞主线程:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
        sleep(5);
        NSLog(@"no..%zu", index);
    });
});

6. dispatch_group:当两个线程都执行完成后,在汇总结果。

dispatch_grout_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) ^{ 
    // do sth...            
});
        
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) ^{
    // do sth...         
});

dispatch_group_notify(group, dispatch_get_main_queue()) ^{
    // 该group中的任务都完成后,该block才会执行。
});

7. dispatch_suspend/dispatch_resume 暂停和恢复运行

dispatch_suspend(group);
dispatch_resume(group);

继上述6的group之后,我们再来看一下暂停线程组和恢复线程组运行的两个API,当执行suspend之后,并不会影响已经提交的任务执行,之后暂停在suspend的之后提交的任务。而resume的作用为恢复线程组,使其继续执行。





© 著作权归作者所有

共有 人打赏支持
iossocket
粉丝 4
博文 18
码字总数 8603
作品 0
西安
程序员
GCD介绍(一): 基本概念和Dispatch Queue

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

于赟 ⋅ 2012/11/04 ⋅ 0

iOS 多线程GCD

一.简介 GCD (Grand Central Dispatch)是Apple开发的多核编程的解决方法。 二.优点 1.GCD可用于多核的并行运算 2.GCD自动利用更多CPU内核(双核,四核) 3.GCD自动管理线程的生命周期(创建线...

龙飞凤舞de心 ⋅ 02/23 ⋅ 0

iOS多线程之GCD

1.简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多...

JlongTian ⋅ 2016/01/08 ⋅ 0

iOS多线程之 GCD (附实战实例)

GCD作为缩写意义有多种。它通常表示最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf),此外它还是共产党的拼音缩写和游戏《鬼吹灯外传》的拼音缩写和“...

iOS雯Ping ⋅ 03/06 ⋅ 0

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

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、GCD 分发队列 GCD 分发队列是执行任务的有力工具。使用分发队列,你可以异步或者阻塞执行任意多个 block 的代码。你可以使用分发队列来执行...

石虎132 ⋅ 2017/12/04 ⋅ 0

多线程—GCD介绍

阅读原文请点击:file:///Users/feifanit/Downloads/iOS开发多线程篇—GCD介绍%20-%20文顶顶%20-%20博客园.html 一、简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中...

细雨微风轻诉流年 ⋅ 2016/09/07 ⋅ 0

关于GCD一些事

1.GCD简单介绍   GCD全称为"Grand Central Dispath" 纯C语言,提供了非常强大的函数 2.GCD的好处   GCD是苹果为多核的并行运算提出的解决方案   GCD会自动利用更多的CPU内核   GCD会...

冰泪_ ⋅ 2016/08/31 ⋅ 0

iOS多线程编程之三——GCD的应用

iOS多线程编程之三——GCD的应用 一、引言 在软件开发中使用多线程可以大大的提升用户体验度,增加工作效率。iOS系统中提供了多种分线程编程的方法,在前两篇博客都有提及: NSThread类进行多...

珲少 ⋅ 2015/05/21 ⋅ 0

多线程 —— GCD

什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内...

业界小白 ⋅ 2016/12/06 ⋅ 0

ios开发多线程篇---GCD的介绍和简单使用

1.GCD的简介: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。而...

琳小兮 ⋅ 2015/03/05 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 16分钟前 ⋅ 0

前阿里P8架构师:精准定制Java架构师学习计划!

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,除了掌握J...

java高级架构牛人 ⋅ 19分钟前 ⋅ 0

zookeper学习

https://blog.csdn.net/u012152619/article/category/6470028

~少司命~ ⋅ 20分钟前 ⋅ 0

Spring MVC ,JSON,JQuery,不懂JQuery,跳过了

/spring-mvc-study/src/main/webapp/course_json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD ......

颖伙虫 ⋅ 21分钟前 ⋅ 0

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

阿里云云栖社区 ⋅ 22分钟前 ⋅ 0

mahout demo

package com.datamine.CollaborativeFiltering.mysql; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommend......

xiaomin0322 ⋅ 23分钟前 ⋅ 0

red hat openstack 12配置要求

安装 openstack 之前,一般要规划整个系统中,到底要多少台机器来参与openstack, 根据rhosp12的官方文档: 最低要求是3台物理机,1台作为director,一台作为 controller ,一台作为computer....

tututu_jiang ⋅ 24分钟前 ⋅ 0

Rocket-Chip在GitHub上的各个源码

在github上通过搜索Rocket-chip可以得到36个结果:其中 https://github.com/freechipsproject/rocket-chip https://github.com/ucb-bar/riscv-boom https://github.com/ucb-bar/fpga-zynq (......

whoisliang ⋅ 29分钟前 ⋅ 0

【HAVENT原创】CentOS 6.5 下 Nginx 的安装与配置

nginx是轻量级的Web服务器、反向代理服务器及邮件服务器,具有占用内存少,并发能力强的优点,已被广泛应用。本文介绍目前最新版本 1.12.2 的安装。 各版本nginx下载地址:http://nginx.org/...

HAVENT ⋅ 36分钟前 ⋅ 0

查看linux系统重启之前的log -- last_kmsg

当 Linux Kernel 出现 BUG 的时候,后走入 panic flow,这个时候由于 Kernel 出现了严重的问题,adbd 也无法响应 adb 连接请求,这个时候想透过读取 Kernel Log Buffer 来看 Kernel Log 是不...

zyzzu ⋅ 36分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部