`
119568242
  • 浏览: 426845 次
  • 性别: Icon_minigender_1
  • 来自: 深圳/湛江
社区版块
存档分类
最新评论

[ios]GCD-Grand Central Dispatch - 2

    博客分类:
  • ios
 
阅读更多

Grand Central Dispatch =GDC

1.有两种,顺序的serial Dispatch Queue 与 并发的Concurrent Dispatch Queue
     前者是所有加入这个queue的block会顺序执行,完成一个在开始第二个。既此队列只开一个线程顺序执行。
     后者是所有加入这个queue的block会并发执行,第二个的开始与第一个是否结束无关,他会选择最有解决线程创建方案,不会每个block创建一个线程(比如b1,b2,b3当要执行b3的时候,b1执行完了,此时b3会加入b1的线程而不会重新创建)。

2.创建方式
     dispatch_queue_t xxx = dispatch_queue_create("queueName",Null) //这个是创建了serial Dispatch Queue
     dispatch_queue_t xxx = dispatch_queue_create("queueName",DISPATCH_QUEUE_CONCURRENT);//这个是创建concurrent dispatch queue
需要人工release

3.Main Dispatch Queue/Global Dispatch Queue
   Main Dispatch Queue 主线程队列 加入次线程的都会在主线程进行执行,既丢入NSRunLoop里。一般需要刷新页面相关的才会使用。
   Global Dispatch Queue 是做一个快速获取的Concurrent dispatch queue存在的,他有4个优先级 background,low,default,high
注意:使用MainDQ 和 GlobalDQ 是不需要进行retain 或release的 

4.dispatch_set_target_queue
     设置队列优先级。
dispatch_set_target_queue(Q1,Q2);
Q1为需要修改优先级的,Q2为Q1要与他同级的。
MainDQ 与GlobalDQ因为是全局 所以无法作为第一个参数。
     在必须将不可并行的处理追加到多个serial Dispatch Queue 中时,如果使用dispatch_set_target_queue函数将目标指定为某一个serialDispatchQueue即可防止处理并行执行。

5.dispatch_after 与 dispatch_walltime
     dispatch_after 为延迟多久加入队列(相对时间)
     dispatch_walltime 为在什么时间加入队列(绝对时间)
ex:
     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3ull * NSEC_PER_SEC);
     dispatch_after(time,dispatch_get_main_queue(),^{…});
     dispatch_time_t 是从第一个参数的时间开始,经历第二个参数的市场之后。
     ull 是C语言数值字面量
     NSEC_PER_SEC为秒为计数单位
     NSEC_PER_MSEC为毫秒的计数单位
     dispatch_walltime 返回的为dispatch_time_t 书p155

*6.Disptach Group
将dispatch 加入group,并且设置执行group队列完后的执行代码。
     ex:
     dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_DEFAULT,0);
dispatch_group_t group=disptach_group_create();
dispatch_group_async(group,queue,^{1...});
dispatch_group_async(group,queue,^{2...});
dispatch_group_async(group,queue,^{3...});
dispatch_group_notify(group,dispatch_get_main_queue(),^{结束后执行的});
dispatch_release(group);

注意:在dispatch_group_notify函数中不管指定怎么样的Dispatch Queue,属于Dispatch Group的处理在追加的block(上面例子的【结束后执行的】)时都已经结束。

另外还有dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
这个表示 调用他的线程永远等待(因为第二个参数DISPATCH_TIME_FOREVER,如果是其他ex:disptach_time_t time=dispatch_time(DISPATCH_TIME_NOW,1ull*NSEC_PER_SEC);
dispatch_group_wait(group,time);
的话就是等待1秒) 
long result=dispatch_group_wait(……);
返回值为long型
if(result==0){
    // 等待时间结束后,group的全部处理执行结束
}else{
    // 等待时间结束后,group的还有未完成的处理
}

正常情况下不适用dispatch_group_wait,而使用dispatch_group_notify(group,dispatch_get_main_queue(),^{结束后执行的});
可以更好的简化代码。

7.dispatch_barrier_async
     为了规避Concurrent dispatch queue使用中的并发读取数据,数据竞争等问题。
使用dispatch_barrier_async
ex:
     queue 为Concurrent dispatch queue
     queue 其他处理1
     queue 其他处理2
     dispatch_barrier_async(queue,blk_for_writing)
     queue 其他处理3
     queue 其他处理4
     其他处理1 2 执行完 才会执行dispatch_barrier_async,dispatch_barrier_async执行完才会执行 其他处理 3 4
     如果其他处理都是数据库读操作  dispatch_barrier_async是数据库写操作,那么这样能保证 3 4 读取的数据是修改(写入)后的,数据保持正确。

8.dispatch_sync
     同步执行,与dispatch_async相反。此方法不能将block加到,mainQueue中,会导致死锁。也不能给Serial Dispatch Queue增加block,也会导致死锁。
     简单的说这个一般不用,用只用在Concurrent dispatch queue中。(其实一般不会用到)

9.dispatch_apply
     重复执行block,x次。
ex:     dispatch(10,queue,^{…block…});
          NSlog(@“done");
     重复执行block 10次,并且等待执行结束后才继续执行NSlog(@“done”)。
注意:dispatch_apply([array count],queue,^(size_t index){…block…});
     size_t index代表数组下标,上面代码会将数组array的每个下表都丢入block中执行一次。

10.dispatch_suspend/dispatch_resume
    dispatch_suspend 挂起已经追加的处理(未执行的处理暂不执行)
    dispatch_resume 恢复已经追加的处理

11.Dispatch Semaphore 
     代码性排他,通过计数器来限制当前代码在执行过程中只能有限的线程数执行。
创建:dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);
创建一个dispatch_semaphore_t 并且初始化计数为1;

等待(此代码后开始限制线程(排他),加锁,并且计数-1)。
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);

排他控制结束(解锁,并且计数+1)
disptach_semaphore_signal(semaphore);

12.Dispatch_once
     保证在应用程序执行过程中只执行一次的指令。
     static dispatch_once_t pred;s
dispatch_once(&pred, ^{……});

13.Dispatch I/O
     通过使用Dispatch I/O可以并发读写数据,提高效率 p167

14.dispatch_queue 与 dispatch_source
     是无法中断的,要么使用内部标志位。
     而dispatch_source 并且可以设置回调的cancel block。
    

分享到:
评论

相关推荐

    iOS GCD-Program-master

    在iOS开发中,Grand Central Dispatch(GCD)是Apple推出的一种多核处理器并行运算技术,用于优化应用程序的性能。GCD是基于C语言的,但可以无缝集成到Objective-C和Swift中。这个名为"IOS GCD-Program-master"的...

    Objective-C中的并发协奏曲:GCD(Grand Central Dispatch)精粹

    Objective-C 最初由 Brad Cox 和 Tom Love 在1980年代早期设计,后来由苹果公司采用并推广,成为 macOS 和 iOS 操作系统的主要开发语言之一。 Objective-C 的主要特点包括: 1. **面向对象**:Objective-C 支持...

    iOS GCD中级篇 - dispatch_semaphore(信号量)的理解及使用1

    在iOS开发中,Grand Central Dispatch (GCD) 是一个强大的多线程管理工具,它提供了一种高效的方式来调度和管理并发任务。其中,`dispatch_semaphore`(信号量)是GCD的一个重要特性,用于控制对共享资源的访问,...

    Grand Central Dispatch(GCD)介绍要点难点案例分享代码解析

    全称:Grand Central Dispatch(GCD) 定义:GCD是苹果公司开发的一套多线程编程的API,用于简化多线程编程的复杂性。 功能:GCD提供了一个易于使用的、基于任务的并发模型,可以将任务提交给系统,系统会自动管理...

    GCD常用和不常用API说明GCD-Demo-master.zip

    在iOS和macOS开发中,Grand Central Dispatch(GCD)是一种强大的多线程技术,用于管理应用程序的并发性。GCD是Apple的C语言库,它抽象了底层的线程和处理器细节,使得开发者可以更方便地利用多核处理器的优势。本...

    iOS GCD详解

    GCD(Grand Central Dispatch),是一套低层API,提供了一种新的方法来进行并发程序编写。它允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOperationQueue更底层更高效,...

    iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)1

    在iOS开发中,Grand Central Dispatch (GCD) 是一种强大的多线程管理工具,它能够帮助开发者高效地处理并发任务。本篇文章主要讨论了如何深入理解GCD中的dispatch_group、dispatch_barrier以及基于线程安全的多读单...

    iOS GCD 开发教程 完整版

    GCD(Grand Central Dispatch)是Apple在OS X和iOS系统中引入的一种多线程处理技术,旨在简化并发编程,提高应用程序的性能和响应速度。GCD利用了操作系统底层的调度机制,允许开发者以一种声明式的方式处理并发任务...

    gcdTest下载图片 dispatch_async

    标题中的“gcdTest下载图片 dispatch_async”涉及到两个主要的iOS编程概念:GCD(Grand Central Dispatch)和异步图像下载。GCD是苹果为多核处理器优化并发编程提供的一种技术,而dispatch_async函数是GCD中用于在...

    ios-dispatch的简单demo.zip

    在iOS开发中,GCD(Grand Central Dispatch)是苹果提供的一种多线程解决方案,它能够帮助开发者有效地管理和调度并发任务,提高程序的执行效率。这个名为"ios-dispatch的简单demo.zip"的压缩包文件包含了关于GCD中...

    iOS GCD开发总结整理

    iOS GCD(Grand Central Dispatch)是Apple在2010年引入的一种多线程解决方案,它为开发者提供了一种高效、简洁的方式来管理并发任务。GCD是基于Cocoa框架的,适用于iOS和Mac OS X平台。本文将深入探讨GCD的基本概念...

    iOS GCD timer 计时器

    在iOS开发中,Grand Central Dispatch (GCD) 是一种强大的多线程管理工具,由Apple引入,用于简化并发编程。GCD timer是基于GCD的一种计时器实现,相较于NSTimer,它提供了一种更高效、更易于管理的计时器解决方案。...

    gcd多线程gcd-demo-master (1).zip

    在IT行业中,多线程是程序设计中的一个重要概念,特别是在iOS和macOS开发中,Grand Central Dispatch(GCD)提供了一种高效、简洁的方式来管理并发和多线程。GCD是Apple开发的一种并行编程技术,它充分利用了多核...

    GCD的简单使用simple-use-of-gcd-master.zip

    GCD,全称为Grand Central Dispatch,是Apple在Mac OS X 10.6 Snow Leopard以及后续版本中引入的一种多核并行处理技术。它是Cocoa框架的一部分,为开发者提供了高效利用多核处理器的能力,简化了并发编程。在iOS和...

    iOS开发多线程-GCD介绍 - iOS知识库1

    GCD(Grand Central Dispatch)是苹果公司推出的多核并行运算解决方案,自动利用更多的CPU内核,自动管理线程的生命周期,程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。 二、GCD的特点 1. ...

    ios开发-iOS开发实用demo之多图片多线程下载实例.zip

    - iOS中的多线程主要通过`GCD (Grand Central Dispatch)`、`NSOperation`和`NSThread`来实现。本示例可能使用了`GCD`,因为它是最高效且易于使用的并发工具。 - `GCD`允许开发者在后台线程执行耗时任务,如下载,...

    iOS多线程-GCD(异步任务,线程锁)

    GCD(Grand Central Dispatch)是苹果推出的一种强大的多线程解决方案,它为开发者提供了简单而高效的方式来管理并发任务。本文将深入探讨GCD中的异步任务、线程锁以及如何在iOS中实现它们。 首先,我们要理解什么...

    ios gcd

    在iOS开发中,Grand Central Dispatch(GCD)是苹果公司提供的多线程解决方案,它极大地简化了并发编程。GCD是基于C语言的API,但同时也很好地与Objective-C和Swift兼容。这篇博客文章《ios gcd》可能深入探讨了如何...

    ios-dispatch的简单demo_.zip

    在iOS开发中, Dispatch(也称为GCD,Grand Central Dispatch)是Apple提供的多线程和并发处理技术。这个“ios-dispatch的简单demo_.zip”压缩包文件包含了一个关于Dispatch学习的实例,主要涵盖了`apply`、`source`...

    IOS应用源码——schwa-iOS-PDF-Reader(PDF阅读器).zip

    这涉及到GCD(Grand Central Dispatch)或OperationQueue的使用。 8. **错误处理和调试**:源码中可能包含了错误处理代码,这对于确保应用的稳定性和可靠性至关重要。同时,开发者可以学习如何使用Xcode的调试工具...

Global site tag (gtag.js) - Google Analytics