iOS多线程之GCD的基本使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS多线程之GCD的基本使用相关的知识,希望对你有一定的参考价值。

  • 使用GCD开发的基本思路

基本思想:将任务(操作)放在队列中去执行

     任务使用block定义

     队列负责调度任务执行所在的线程以及具体的执行时间

     队列的特点是先进先出(FIFO)的,新添加至队列的操作都会排在队尾.

     GCD的函数都是以dispatch开头的

     注意 :队列不是线程,也不对应CPU。


队列:dispatch_queue_t

     两种队列:串行队列、并行队列


队列上的操作:添加任务

     两种任务:同步任务、异步任务


  • 队列及任务

GCD的串行队列,意味着队列中的任务排队执行

1)添加异步任务:创建一个线程,所有被添加的任务排队执行

dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL);
for ( int i=0; i<10; i++) {
    dispatch_async(q, ^{
        NSLog(@"%@ %d", [NSThread currentThread], i);
    });
}

2)添加同步任务:不创建线程,任务在当前线程中执行,极少使用

dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL);
dispatch_sync(q, ^{
    NSLog(@"%@ %d", [NSThread currentThread], i);
});


CGD并行队列,意味着队列中任务不会排队执行,随机执行

1)添加异步任务:会创建线程,个数不确定,任务的先后顺序不确定

dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(q, ^{
    NSLog(@"%@ %d", [NSThread currentThread], i);
});

2)添加同步任务:不会创建线程,极少使用

dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(q, ^{
    NSLog(@"%@ %d", [NSThread currentThread], i);
});

     

无论什么队列和什么任务,线程的创建和回收都不需要程序员参与,线程的创建和回收是由队列负责的



  • 全局队列

GCD的最常用队列是全局队列和主队列,这两种队列不需要创建,是每个App都具有的

获得全局队列

dispatch_queue_t dispatch_get_global_queue( long identifier, unsigned long flags);

     flags参数:保留参数,传0即可

     identifier参数:用于指定使用哪种全局队列


四种全局队列:

     #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 //最低的后台优先级

全局队列是系统的,拿过来直接用即可,都是并行队列

     添加异步任务,会创建多个线程,任务无须执行

     添加同步任务,不会创建新线程,任务排序执行


  • 主队列

每一个应用程序都只有一个主线程,在ios开发中,所有UI的更新操作,都必须在主线程中去做

获得主队列:

dispatch_queue_t dispatch_get_main_queue(void);

主队列也是系统的,拿过来直接用即可,添加的任务都会在主线程终止hi性

     添加异步任务:在主线程中顺序执行,无异步效果

     添加同步任务:任务不会执行


常见的用法:

     如果一个任务想要在后台(子线程)执行,则使用全局队列添加异步任务

     如果一个任务想要在主线程执行,则使用主队列添加同步任务


  • 异步下载图片

这是一类最常见的做法,在子线程中请求数据,完成后回到主线程中更新相关的UI元素

    技术分享



  • GCD的一些其他常用操作

1)任务的延迟执行

dispatch_after函数会延迟将一个block任务添加到队列中

void dispatch_after( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);

     在Xcode中,通过快捷键补全的代码:

     技术分享     

     delayInSeconds:延迟的秒数

     使用的主队列,即延迟的任务在主线程中执行

     最后的block,即任务代码


2)任务的多次执行

dispatch_apply函数将一个任务放到队列中多次执行

     具体是串行执行还是并行执行是由具体的队列决定。

     dispatch_apply不会立刻返回,在执行完毕后才返回,是同步的调用

void dispatch_apply( size_t iterations, dispatch_queue_t queue, void (^block)( size_t));

     iteractions:执行的次数

     queue:队列,一般使用全局队列

     block:任务代码

应用场景:将关系不紧密的循环操作放到后台运行


3)保证任务只执行一次

在多线程的环境下,同故宫dispatch_once()保证一个任务只会执行一次

     在Xcode中,通过快捷键补全的代码:

    技术分享

     在block中添加任务代码即可

应用场景:单例对象的创建


本文出自 “teacherAn” 博客,请务必保留此出处http://annmeng.blog.51cto.com/3321237/1746609

以上是关于iOS多线程之GCD的基本使用的主要内容,如果未能解决你的问题,请参考以下文章

iOS 多线程之GCD的使用

iOS多线程开发之离不开的GCD(上篇)

iOS底层探索之多线程—GCD源码分析( 信号量dispatch_semaphore_t)

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

iOS-多线程之GCD(原创)

iOS多线程开发之GCD(下篇)