iOS 多线程(GCD)

多线程(GCD) 全称:Grand Center Dispatch (抽象层次:高)

GCD是纯C语言,可想而知的执行速度是很高的。在程序中可以直接调用,不需要导入libdispatch.dylib这个库,系统库中已经包含这个库,当程序执行的过程中会动态加载。GCD编程的核心就是dispatch队列,程序将在该队列中执行任务。

主线程串行队列:dispatch_get_main_queue()

先区分同步(dispatch_sync)和异步(dispatch_async)执行的任务。dispatch_sync同步执行任务函数,不会开启新的线程,dispatch_async 异步执行任务函数,会开启新的线程。再区分串行和并行。串行是一个任务接着一个任务依次按照某一种特定的顺序执行下去,例如,起床-->洗漱-->上班-->下班-->睡觉。并行是两个或两个以上的程序并发执行,例如,喝咖啡-->看书-->听音乐。

dispatch_queue_t mainQueue = dispatch_get_main_queue();

主线程串行队列同步执行任务,程序一直处于等待状态,block中的代码将执行不到,故会发生死锁。

同步

较上图比较,异步执行任务,不发生等待主线程而死锁。

异步

主线程串行队列由系统默认生成的,不可以调用dispatch_resume()和dispatch_suspend()控制程序执行。

全局并发队列:dispatch_get_global_queue()(可以设置优先级)

dispatch_queue_t  globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

在执行耗时的操作,比如读取网络数据、IO、数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。但是全局并发队列同步执行任务,在主线程执行会导致页面卡顿,异步不存在这样的问题。同主线程不能调用dispatch_resume()和dispatch_suspend()控制程序执行。

自定义队列:dispatch_queue_create()(可以为串行,也可以为并发)

(串行)dispatch_queue_t serialQueue = dispatch_queue_create("com.dullgrass.serialQueue", DISPATCH_QUEUE_SERIAL);

嵌套执行同步任务,程序发生死锁类似主线程嵌套同步执行。

(并行)dispatch_queue_t conCurrentQueue =  dispatch_queue_create("com.dullgrass.conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);

嵌套并发执行同步任务,程序不会发生死锁。

队列组:dispatch_group_create()(通过dispatch_group_notify,可以直接监听组里所有线程完成情况)

优点:是 Apple 开发的一个多核编程的解决方法,简单易用,效率高,速度快,基于C语言,更底层更高效,并且不是Cocoa框架的一部分,自动管理线程生命周期(创建线程、调度任务、销毁线程)。

缺点: 使用GCD的场景如果很复杂,就有非常大的可能遇到死锁问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录:iOS多线程(一)--pthread、NSThreadiOS多线程(二)--GCD详解iOS多线程(三)--...
    Claire_wu阅读 1,097评论 0 6
  • 一、简介在iOS所有实现多线程的方案中,GCD应该是最有魅力的,因为GCD本身是苹果公司为多核的并行运算提出的解决...
    MYS_iOS_8801阅读 580评论 0 0
  • 多线程学习笔记-GCD 我把这篇文章所用到的代码总结到这里->GCD项目总结下载地址-GCD-wxk可以下载参考 ...
    wxkkkkk阅读 549评论 0 2
  • 一、基本概念 线程是用来执行任务的,线程彻底执行完任务A才能执行任务B,为了同时执行两个任务,产生了多线程 1、进...
    空白Null阅读 744评论 0 3
  • 落笔的惆怅 留白处风光无限 孤单处熙熙攘攘 繁华如斯 何处是家乡 呼吸的渴望 窒息处喧嚣尘上 寥落处气息悠扬 轻狂...
    翔宜阅读 364评论 0 1