iOS开发:使用GCD实现多线程

  除了上一篇文章说到到NSThread线程,还有一个GCD(Grand Central Dispath),是Apple新开发的一个解决多核编程的解决方案,充分的利用CPU资源,将所有的任务,放到一个任务队列进行调度。 GCD 默认提供了全局的并发队列,供整个应用使用,不需要创建。

  • 同步和异步的区别

    • dispatch_sync 同步:不具备开启线程的能力
    • dispatch_async 异步 :具备开启线程的能力
  • 任务的执行方式

    • 并发队列:多个任务同时执行,并发只能在一步函数下才执行 “异步“
    • 串行队列:让任务一个接一个的运行

注意:一般在实际开发中最常用的是 dispatch_async 。

下面介绍几种常用的队列使用

一:最最常用的全局并发队列:

      //获取全局并发队列
        let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        //将任务添加到队列中 并发执行
        dispatch_async(queue) { () -> Void in
            //doSomething...任务1
        }
        dispatch_async(queue) { () -> Void in
            //doSomething...任务2
        }
        dispatch_async(queue) { () -> Void in
            //doSomething...任务3
        }

        //暂停一个队列
        dispatch_suspend(queue)
        //继续队列
        dispatch_resume(queue)

二:串行队列,队列中的任务不会并发执行,会一个任务执行完成后再执行另外一个任务

 //创建串行队列
        let serialQueue = dispatch_queue_create("dispatch_queue_name", nil)
        //将任务添加到队列中 一个任务执行完成后再执行另一个任务
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任务1
        }
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任务2
        }
        dispatch_async(serialQueue) { () -> Void in
            //doSomething... 任务3
        }

三:GCD线程间的通信,通常用于子线程请求完数据,回到主线程更新UI

 //线程间通信
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            // 在子线程做一些事情
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //在主线程更新UI...
            })
        }

四:线程延时执行

    //线程延时执行
        let second:Double = 3.0
        let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(second * Double(NSEC_PER_SEC)))

        //3s后回到主线程中执行任务
        dispatch_after(dtime, dispatch_get_main_queue()) { () -> Void in

        }
        //3s后会开启一个新的线程执行队列中的任务
        dispatch_after(dtime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in

        }

五:一次性代码,顾名思义,在应用生命周期内,block里代码块只会执行一次。

      var once:dispatch_once_t = 0
        dispatch_once(&once, { () -> Void in
            //在应用生命周期内只执行一次
        })
      

六:队列组:将一些任务放进一个队列组,当所有任务执行完成后,会执行组的notify。

    /**********************************队列组******************************************/
        let group = dispatch_group_create()
        let groupQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任务1
        }
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任务2
        }
        dispatch_group_async(group, groupQueue){ () -> Void in
            //任务3
        }
        dispatch_group_notify(group, groupQueue) { () -> Void in
            // 会等任务1、任务2、任务3执行完毕后执行
        }

完!

时间: 2024-11-02 23:32:16

iOS开发:使用GCD实现多线程的相关文章

iOS开发中GCD在多线程方面的理解

GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0. GCD是一个替代诸如NSThread等技术的很高效和强大的技术.GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题. GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识. 在开始之前,需要理解是要提供给GCD队列的是代

iOS开发——实用技术OC篇&多线程整合

多线程整合 本文知识对iOS开发中多线程的一些知识整合,关于一些概念和技术问题并没有过多的介绍,如果你想了解更多请查看笔者之前写的iOS开发之多线程详解(比较完整):但是有部分涉及到之前文章中没有的技术点和常识,比如加锁的方式,面试相关的,还有一些关于GCD的高级用法,希望你能认真看完,或许可以收获到很多! http://www.cnblogs.com/iCocos/p/4553103.html http://www.cnblogs.com/iCocos/p/4553262.html ??先来看

iOS开发之再探多线程编程:Grand Central Dispatch详解

之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD的使用方式.GCD的历史以及好处在此就不做过多的赘述了.本篇博客会通过一系列的实例来好好的总结一下GCD.GCD在iOS开发中还是比较重要的,使用场景也是非常多的,处理一些比较耗时的任务时基本上都会使用到GCD, 在使用是我们也要主要一些线程安全也死锁的东西. 本篇博客中对iOS中的GCD技术进行了较为全面的总结,下方模拟器的截图就是我们今天要介

ios开发:GCD多线程

ios有三种多线程编程技术,分别是NSThread,Cocoa NSOperation和GCD,GCD全称Grand Central Dispatch 是Apple开发的一个多核编程的解决方法,在iOS4.0开始之后才能使用.GCD是一个可以替代NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,而且其使用起来比前两者更加的简单方便,今天主要给大家介绍一下有关GCD的使用. GCD的工作原理是:让程序平行排队的特定任务,根

iOS开发关于GCD多线程方面的知识(1)

1.同步和异步 (1)同步(sync):A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求 不到,怎么办,A线程只能等待下去 (2)异步(async):A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程 仍然请求的到,A线程无需等待

iOS 开发线程 gcd

基础知识: 下午9:09 一.基础概念 1.什么是GCD 全称是Grand Central Dispath 纯C语言编写,提供非常多且强大的函数,是目前推荐的多线程开发方法,NSOperation便是基于GCD的封装 2.GCD的优势 1.为多核的并行运算提出了解决方案 2.GCD会自动利用更多的CPU内核,比如 双核,四核 3.GCD自动管理线程的生命周期(创建线程,调度任务,销毁线程) 4.程序员只需告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.GCD中的两个核心概念 1.任务

iOS中通过GCD实现多线程用法

GCD简介 GCD全称Grand Central Dispatch,可翻译为“牛逼的中枢调度器”. 纯C语言,提供了非常多强大的函数. GCD优势: GCD是苹果公司为多核的并行运算提出的解决方案. GCD会自动利用更多的CPU内核(比如双核.四核). GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程). 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码. 任务和队列 GCD中有2个核心概念 任务:执行什么操作. 队列:用来存放任务. GCD的使用就2个步骤 定制任

IOS开发笔记_AFN中多线程依赖

我们平常在开发当中很可能会遇到同时开启两个网络请求,然后把资源下载下来后进行合并操作,那么在AFN中我们究竟要怎么做呢,当然,以下可能写出一些个人的封装技巧,有兴趣的朋友可以发继续关注我. #pragma mark -  getter - (NSOperationQueue *)queue { if (!_queue) { _queue = [[NSOperationQueuealloc]init]; } return_queue; } 这里是我个人对AFN的一个封装类,后面会说到 NSOper

精通IOS开发-block使用与多线程

Block Block封装了一段代码,可以在任何时候执行 Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值. 苹果官方建议尽量多用block.在多线程.异步任务.集合遍历.集合排序.动画转场用的很多 #include<stdio.h> int sum(int a,int b) { return a + b; } int main() { NSLog(@"%d",sum(5,6)); //如何定义block //void (^myblock) ()

iOS开发之多线程技术——GCD篇

本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & Asynchronous 同步 & 异步 二.Serial Queues & Concurrent Queues 串行 & 并发 三.Global Queues全局队列 四.Main Queue主队列 五.同步的作用 六.dispatch_time延迟操作 七.线程安全(单例dispa