关于GCD的API(1)

作者: 静谧的橘子 | 来源:发表于2017-11-12 13:43 被阅读25次

Grand Central Dispatch(GCD)是异步执行任务的技术之一。摘自苹果的官方说明。
所谓异步执行任务的技术,也就是我们所说的多线程执行任务。
利用GCD我们可以节省很多时间进行任务处理。
首先,Dispatch Queue : 执行处理的等待队列。
种类有两种:
1.Serial Dispatch Queue - 等待现在执行中处理结束.
2.Concurrent Dispatch Queue - 不等待现在执行中处理结束.

接下来我们就看看都有哪些API?

1.dispatch_queue_create

dispatch_queue_t  queue  = 
dispatch_queue_create("com.example.gcd.MyDispatchQueue",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue,^{NSLog(@"block on MyDispatchQueue")});
dispatch_release(queue);

首先这是一个Concurrent Dispatch Queue的线程,在第二个参数指定的类型,如果想设定为Serial Dispatch Queue类型,则指定第二个参数为NULL,第一个参数是线程的名称,这个API返回一个dispatch_queue_t类型的变量。
在使用完成以后,我们需要通过dispatch_release来释放这个Dispatch Queue,因为Dispatch Queue并没有像Block那样具有作为对象来处理的技术。

注意事项:一个Serial Dispatch Queue同时只能执行1个追加处理,虽然Serial Dispatch Queue和Concurrent Dispatch Queue受系统资源的限制,但是dispatch_queue_create函数可以生成任意多个Dispatch Queue。
所以如果过多使用多线程,就会消耗大量的内存,引起大量的上下文切换大幅度降低系统的响应性能。
Serial Dispatch Queue 为了避免多线程编程问题之一---多个线程同时更新相同资源导致数据竞争时使用。

2.Main Dispatch Queue/Global Dispatch Queue

Main Dispatch Queue和Global Dispatch Queue是系统给我们提供的,不需要自己生成。
Main Dispatch Queue:是在主线程中执行的Dispatch Queue.因为主线程就一个,所以是Serial Dispatch Queue类型。
追加到Main Dispatch Queue的处理在主线程的runloop中执行。由于在主线程中执行,因此要将用户界面的界面更新等一些必须在主线程总执行的处理追加到Main Dispatch Queue使用。
Global Dispatch Queue:是系统提供的Concurrent Dispatch Queue类型的Dispatch Queue。
Global Dispatch Queue有4个执行优先级,分别是DISPATCH_QUEUE_PRIORITY_HIGH(高优先级)、DISPATCH_QUEUE_PRIORITY_DEFAULT(默认优先级)、DISPATCH_QUEUE_PRIORITY_LOW(低优先级)、DISPATCH_QUEUE_PRIORITY_BACKGROUND(后台优先级)

各种Dispatch Queue获取方法如下:

//主线程获取方法
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
//Global Dispatch Queue各优先级的获取方法
//高优先级
dispatch_queue_t globalDispatchQueueHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH , 0);
//默认优先级
dispatch_queue_t globalDispatchQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);
//低优先级
dispatch_queue_t globalDispatchQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW , 0);
//后台优先级
dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND , 0);

使用系统提供的这两种,并不需要我们进行release释放。

3.dispatch_set_target_queue

dispatch_queue_create函数生成的Dispatch Queue不管是何种类型,都使用与Global Dispatch Queue(默认优先级DISPATCH_QUEUE_PRIORITY_DEFAULT)具有相同的执行优先级。
变更线程的执行优先级要使用dispatch_set_target_queue函数。
在后台执行动作处理的Serial Dispatch Queue的生成方法如下:

dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);
dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_set_target_queue(mySerialDispatchQueue,  globalDispatchQueueBackground);

第一个参数是要变更执行优先级的Dispatch Queue,第二个参数是为第一个参数提供执行优先级的Global Dispatch Queue。
第一个参数如果指定Main Dispatch Queue 和 Global Dispatch Queue则不知道会出现什么状况,因此这些均不可指定。
dispatch_set_target_queue函数,不仅可以变更Dispatch Queue的执行优先级,还可以作成Dispatch Queue的执行阶层。
多个Serial Dispatch Queue同时执行是并行执行,在必须将不可并行执行的处理追加到多个Serial Dispatch Queue中时,使用dispatch_set_target_queue函数将目标指定为某一个Serial Dispatch Queue,即可防止处理并行执行。

dispatch_queue_t myConcurrentDispatchQueue  = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", NULL);
dispatch_queue_t myConcurrentDispatchQueue1 = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue1", NULL);
dispatch_async(myConcurrentDispatchQueue, ^{
        NSLog(@"----");
});
dispatch_async(myConcurrentDispatchQueue1, ^{
        NSLog(@"~~~~");
});
[1123:85237] ~~~~
[1123:85236] ----
dispatch_queue_t myConcurrentDispatchQueue  = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", NULL);
dispatch_queue_t myConcurrentDispatchQueue1 = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue1", NULL);
dispatch_queue_t myConcurrentDispatchQueue2 = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue1", NULL);
dispatch_set_target_queue(myConcurrentDispatchQueue, myConcurrentDispatchQueue2);
dispatch_set_target_queue(myConcurrentDispatchQueue1, myConcurrentDispatchQueue2);
dispatch_async(myConcurrentDispatchQueue, ^{
        NSLog(@"----");
});
dispatch_async(myConcurrentDispatchQueue1, ^{
        NSLog(@"~~~~");
});
[1136:87227] ----
[1136:87227] ~~~~

相关文章

  • 关于GCD的API(1)

    Grand Central Dispatch(GCD)是异步执行任务的技术之一。摘自苹果的官方说明。所谓异步执行任...

  • GCD 任务与队列 同步异步、串行并行

    1、什么是GCD? GCD全称 Grand Central Dispatch,纯C语言API,提供非常强大的函数。...

  • 笔记 - 多线程之GCD

    目录 概念 常用API的使用 关于GCD的面试题 一、概念 1.1、什么是GCD? 定义想执行的任务,并追加到适当...

  • GCD使用

    GCD 简介: 1> iOS和OS X的核心是XNU内核,GCD是基于XNU内核实现的 2> GCD的API全部在...

  • iOS GCD 线程调用

    GCD:Grand Central Dispatch强大的中枢调节器 GCD:1.基于底层C语言的API接口 ...

  • 关于GCD的API(2)

    4.dispatch_after 想在指定时间后执行处理的情况,可使用dispatch_after函数来实现。 第...

  • 关于GCD的API(3)

    7.dispatch_apply dispatch_apply函数按指定的次数将指定的Block追击到指定的Dis...

  • iOS多线程编程之GCD详解(一)

    1. GCD简介 iOS开发中多线程的API主要有pthread,NSThread,NSOperation和GCD...

  • GCD全集

    (一)GCD的API 1.DispatchQueue (1).DispatchQueue 先进先出FIFO (2)...

  • GCD API记录(二)

    前言 这是关于GCD的第二篇文章,GCD的API有100多个,通过快捷键Option + 单击,可以在Refere...

网友评论

    本文标题:关于GCD的API(1)

    本文链接:https://www.haomeiwen.com/subject/gqfnpxtx.html