iOS多线程开发系列之(三)Grand Central Dispatch(GCD)

上两篇介绍了NSThread和NSOperation的用法,这篇是对第三种多线程开发GCD的介绍

介绍:

GCD是苹果公司在iOS4+以后推出的多线程技术,也是苹果着力推荐的,由于基于C语言开发的,所以它的高效性无与伦比的,但学习难度可能在其他两个之上。

创建串行队列

  1. 使用dispatch_queue_create函数
  2. 使用主队列:使用dispatch_get_main_queue()获得主队列
    dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);
    

第一个参数是队列的名称,调试的时候是十分有用的,苹果公司推荐做法是倒公司网址名,例如:com.baidu.www

第二个参数是队列的类型,若为nil或者DISPATCH_QUEUE_SERIAL为串行队列

    dispatch_queue_t queue = dispatch_get_main_queue();获得主线程队列(串行)

创建并行队列

dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);

第二个参数设置为:

                DISPATCH_QUEUE_CONCURRENT

dispatch_queue_t queue=dispatch_get_global_queue(long identifier, unsigned long flags);

第一个参数可以设置该并行队列的优先级,分高、中、低、更低三个优先级队列

#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

创建同步任务

dispatch_sync(queue, ^{
    //block具体代码
});

创建异步任务

dispatch_async(queue, ^{
    //block具体代码
});

模拟一下可能遇到的几种情况

情况一:一次性执行某个任务(单例模式中用到)

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

情况二:大量的网络请求

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  //子线程中开始网络请求数据

  dispatch_sync(dispatch_get_main_queue(), ^{
    //在主线程中更新UI代码

  });
});

情况三:延迟N秒执行某个任务:

double delayInSeconds = N;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});

情况四:数据加载完毕后在后台将数据进行保存数据库中(缓存时)

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    });

情况五:等在它加入队列之前的block执行完毕之后,才执行,等它执行完毕之后,在它加入队列的之后的block才会执行

    dispatch_barrier_async(dispatch_queue_t queue, ^{

});

情况六:非常多的数据需要多线程处理,处理玩不之后再汇总到一块的主线程执行(跟情况一的情景一致)

   dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
 // 线程一的任务
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
   // 线程二的任务
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
 // 汇总执行
});

GCD 的另外一个应用

我们都知道当我们点击home键关闭应用的时候,5秒以后这个应用将不再在内存中运行,而利用GCD可以当应用有10分钟的后台生存时间,这样我们可以把没有收集到的数据,轻轻松松的传给服务器,进行数据的保存整理和汇总。

时间: 2024-08-02 06:25:02

iOS多线程开发系列之(三)Grand Central Dispatch(GCD)的相关文章

iOS多线程开发系列之(二)NSOperation

上一篇我们简单的对iOS多线程开发系列(一)三种多线程办法进行对比性能和操作的复杂度,并认真介绍了NSThread的使用. 我们借助上一次的例子完全可以采取NSOperation方法进行实现 NSOperation不具备封装操作的能力,必须使用它的子类: NSInvocationOperation NSBlockOperation 更简洁的Block实现方法,功能上与 NSInvocationOperation基本一致 自定义子类继承NSOperation,实现内部相应的方法 NSInvocat

Grand Central Dispatch (GCD)

Grand Central Dispatch (GCD) Reference Grand Central Dispatch (GCD) comprises language features, runtime libraries, and system enhancements that provide systemic, comprehensive improvements to the support for concurrent code execution on multicore ha

iOS多线程之Grand Central Dispatch(GCD)详解

GCD 技术中,同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)等概念常常令人迷惑,不好理解.本文将对这两对概念进行尽可能简单的阐释. 同步和异步是针对当前代码流(即当前线程)和加入队列中的任务之间执行顺序的关系而言的.以同步的方式向队列中添加任务会阻塞当前线程,直到同步到队列中的任务执行完毕返回后,才会接着执行当前的代码流:以异步的方式向队列中添加的任务则不会阻塞当前线程,将任务添加到队列中后,不用等待任

iOS多线程开发系列之(一)NSThread

什么是多线程? 一个进程的开始阶段系统会分配一个主线程进行正常的工作,工作过程中是依次执行的,只有这个任务执行完毕的时候才能执行下一个任务,两个或多个任务不能同时执行.这样的工作效率是低效的,因此就引入了多线程,能够利用iPhone设备多核的优势同时并发的处理多个事件. 三种多线程技术: 1.NSThread 2.NSOperation.NSOperationQueue 3.GCD 分析三种技术 这三种技术从上到下封装性逐步降低.造成逐步复杂.高效性逐步提升,GCD是基于C语言开发的,最底层.用

iOS多线程开发之深入GCD

iOS多线程开发之深入GCD 一.前言         在以前的一些系列博客中,对iOS中线程的管理做了总结,其中涵盖了GCD的相关基础知识:http://my.oschina.net/u/2340880/blog/417746.那里面将GCD的线程管理能力,列队组能力,通过信号和消息控制程序流程的能力都有介绍,这里,我们继续深入GCD的功能,通过GCD来处理一些逻辑更加复杂的代码功能. 二.延时追加任务         当我们在程序中处理延时任务的时候,我们一般会通过两种方式,一种是通过定时器

iOS多线程开发——NSThread浅析_IOS

在iOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,为了学习的完整性,今天我们主要从代码层面来实现NSThread的使用.案例代码上传至 https://github.com/chenyufeng1991/NSThread. (1)初始化并启动一个线程 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated

C#微信公众号开发系列教程三(消息体签名及加解密)

原文:C#微信公众号开发系列教程三(消息体签名及加解密)   C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太

IOS多线程开发之线程的状态_IOS

大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续

【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计

   这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图:1.window 7的开始菜单 2.有道词典的主菜单 3.QQ的开始菜单 4.我写的词典软件的开始菜单 当你左键单击开始菜单时,就会弹出相应的菜单选项,然后你就可以进行相关操作.本文只讲如何实现点击按钮,弹出菜单功能,至于点击菜单后的事件需要你自己编写.当然,关于右击按钮出现菜单的方法,则是要重写qt自带的函数,至于具体操作可以百度. 要想使按钮实现左