`
119568242
  • 浏览: 420725 次
  • 性别: 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。
    

分享到:
评论

相关推荐

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

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

    GCD IOS example

    Grand Central Dispatch (GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更...

    IOS 多线程GCD详解

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。 dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。 #definedispatch_get_main_queue() \DISPATCH...

    Async.OC:Objective-C中的语法糖,用于Grand Central Dispatch中的异步调度

    异步OC 用Objective-C重写... 代替熟悉的GCD语法: dispatch_async (dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0 ), ^{ NSLog ( @" A: This is run on the background " ); dispatch_async ( dis

    iOS多线程GCD和线程锁的使用

    iOS多线程编程之Grand Central Dispatch(GCD)使用,卖票的例子来讲NSThread的线程同步,使用了两种锁,一种NSCondition ,一种是:NSLock,还有加了一个 线程3 去唤醒其他两个线程锁中的wait,里面的注释很已经写的...

    详解iOS多线程GCD问题

    GCD是Grand Central Dispatch的简称,它是基于C语言的。如果使用GCD,完全由系统管理线程,我们不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的调度队列(dispatch queue)。GCD会负责创建线程和调度你...

    Mac.OS.X和iOS中的并行开发

    This concise book shows you how to use Apple's Grand Central Dispatch (GCD) to simplify programming on multicore iOS devices and Mac OS X. Managing your application’s resources on more than one ...

    iOS应用程序中通过dispatch队列控制线程执行的方法

    Grand Central Dispatch简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统,iOS应用程序中通过dispatch队列控制线程执行则是以并发来达到多核优化的重要途径.

    ios 多线程编程指南.pdf

    如操作对象(Operation objects)和Grand Central Dispatch(GCD),提供一个更加现代化和高效率的基础设施来实现多核并发,但是Mac OS X和iOS也提供一套接口来创建和管理线程。 本文档介绍了Mac OS X上面的可用线程...

    多线程GCD的使用

    iOS多线程编程之Grand Central Dispatch(GCD)使用,具有1、常用的方法dispatch_async 2、dispatch_group_async 3、dispatch_barrier_async 4、dispatch_apply的用法

    iOS 多线程编程指南 中文版

    虽然更新的技术 如操作对象(Operation objects)和 Grand Central Dispatch(GCD),提供一个更 加现代化和高效率的基础设施来实现多核并发,但是 Mac OS X 和 iOS 也提供一套接 口来创建和管理线程。 本文档介绍了 Mac ...

    Concurrency by Tutorials - iOS 并发编程指南 (EPub格式)

    了解Grand Central Dispatch,Apple对C的libdispatch的实现,也称为GCD,因为它是排队任务并行运行的最简单方法之一。 然后,当GCD没有完全削减它时,采取操作和操作队列; 您将学习如何进一步定制和重用您的并发...

    Pro Multithreading and Memory Management for iOS and OS X

    Pro Multithreading and Memory Management for iOS and OS X with ARC, Grand Central Dispatch, and Blocks

    CFHipsterRef

    Grand Central Dispatch Inter-Process Communication CoreServices ImageI/O Accelerate Security SystemConfiguration International Components for Unicode DictionaryServices Xcode Toolchain Third-Party ...

    frida-scripts

    钩住了iOS的Grand Central Dispatch(GCD)。 这对于显示线程创建很有用。 打印回溯时,您甚至可以了解整个程序流程。 在高负载下( CommCenter其连接到CommCenter ,打印可能会出现CommCenter ,但是效果很好。 在...

    iOS多线程编程之NSThread的使用案例

    2、Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用)3、GCD 全称:Grand Central Dispatch( iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用) 这三种编程方式从上到下,抽象度...

    ios 多线程编程指南

    线程是单个应用中可以并发执行多个代码路径的多种技术之一。虽然更新的技术 如操作对象(Operation objects)和 Grand Central Dispatch(GCD),

    详解IOS中GCD的使用

    Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行...

    iOS多线程编程指南

    线程是单个应用中可以并发执行多个代码路径的多种技术之一。虽然更新的技术 如操作对象(Operation objects)和 Grand Central Dispatch(GCD),

    详解iOS多线程GCD的使用

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,本文给大家详细介绍IOS中GCD的使用,需要的朋友参考下

Global site tag (gtag.js) - Google Analytics