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中的代码将执行不到,故会发生死锁。

iOS 多线程(GCD)_第1张图片
同步

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

iOS 多线程(GCD)_第2张图片
异步

主线程串行队列由系统默认生成的,不可以调用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 多线程(GCD))