文档章节

GCD队列

iossocket
 iossocket
发布于 2015/06/21 11:00
字数 992
阅读 67
收藏 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
博文 19
码字总数 8603
作品 0
西安
程序员
GCD介绍(一): 基本概念和Dispatch Queue

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

于赟
2012/11/04
0
0
iOS 多线程GCD

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

龙飞凤舞de心
02/23
0
0
iOS多线程之GCD

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

JlongTian
2016/01/08
74
0
iOS多线程之 GCD (附实战实例)

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

iOS雯Ping
03/06
0
0
iOS OS X 和 iOS 中的多线程技术-4.1 (GCD)

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

石虎132
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python深体验,常见的数据处理方式(必须要懂的)

1.缺失值处理 - 拉格朗日插值法 input_file数据文件内容(存在部分缺失值): from scipy.interpolate import lagrangeimport pandas as pdimport numpy as npinput_file = './dat...

无也Python
26分钟前
2
0
Spring MVC注解故障追踪记

Spring MVC是美团点评很多团队使用的Web框架。在基于Spring MVC的项目里,注解的使用几乎遍布在项目中的各个模块,有Java提供的注解,如:@Override、@Deprecated等;也有Spring提供的注解,...

Skqing
27分钟前
4
0
区块链入门教程以太坊源码分析cmd包分析

  兄弟连区块链入门教程以太坊源码分析cmd包分析。 ### cmd包概述 * geth 主要Ethereum CLI客户端。它是Ethereum网络(eth主网,测试网络或私有网)的入口点,使用此命令可以使节点作为ful...

兄弟连区块链入门教程
29分钟前
1
0
@Autowired 报红线

代码可正常跑,不过红线看着有点难受,解决方案 使用@Autowired(required=false) 或者@Resource. 这两者区别网上一大堆

斩神魂
34分钟前
1
0
DataTable中检索信息 (C#)

C#_从DataTable中检索信息 存在于内存中的虚拟表DataTable,绑定在数据显示控件后,如果想在再检索其中某些信息,可以利用DataTable.Select方法进行检索,避免了重复的读取数据库。Select方法...

CS-CS01
42分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部