您的位置:首页 > 其它

GCD详解及实现

2015-11-29 21:39 246 查看

GCD-概要

什么是GCD

GCD-Grand Central Dispatch 是异步执行的任务之一,将应用程序中线程管理用的带来在系统级中进行实现,开发者只要将任务追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务,GCD使用非常简洁的记述方式,实现了颇为复杂的多线程编程。

(Dispatch Queue)-执行处理的等待队列,应用程序开发人员,通过dispathc_async函数等api,在block语法中,编写需要执行的处理,并将其追加到Dispatch Queue中进行处理。

例如,dispatch_async(queue,^{

执行长时间处理的任务,如数据库查询、访问。

长时间处理结束,这时候通常需要调用主线程处理结果。

这时候调用,

dispatch_async(dispatch_get_main_queue(),^{

在主线程可执行的处理,如用户界面更新。

});

});

多线程中存在的问题:

多个线程操作同一个资源导致数据不一致(数据竞争)

死锁-多个线程持续相互等待

太多线程消耗大量内存

多线程的优点,可以保证应用程序的响应性能,在ios开发中使用多线程编程在执行长时间处理时仍可保证用户界面的响应性能。而苹果提供的GCD大大简化了偏于复杂多线程编码的源代码。

GCD的主要API

dispatch queue的创建。

dispatch_queue执行处理的等待队列,有两种方式的dispatch_queue。serial dispatch queue,需要等待现执行中处理结束后才执行下一个任务。

concurrent dispatch queue,不等待现在执行中处理结束。可以并行执行多个处理,并行处理的数量取决于当前系统的状态(cpu核心数、dispatch queue处理数,cpu负荷等系统状态);

创建方式有两种:

方法一、通过GCD提供的API生成Dispatch Queue

dispatch_queue_t mySelfDefineDispatchQueue=dispatch_queue_create(“com.house.zhang”,NULL); 参数一指定了dispatch queue的名称(建议使用应用程序ID-在调试,崩溃log中会标示),参数二代表dispatch queue类型,当为serial dipatch queue时该参数设置为NULL,另外一种则设置为DISPATCH_QUEUE_CONCURRENT

方法二、获取系统标准提供的的Dispatch Queue

系统提供了,Main Dispatch Queue和Global Dispatch Queue。

Main Dispatch Queue是在主线程中执行的Dispatch Queue,因为主线程只有一个,所以其类型为serial dispatch queue,追加到,Main Dispatch Queue的处理在主线程的RunLoop中执行,由于在主线程中执行,因此要将用户界面更新等一些必须在主线程执行的处理追加到Main Dispatch Queue中使用。与NSObject类中的performSelectorOnMainThread方法相同。

Global Dispatch queue是所有应用程序都能够使用的Concurrent Dispatch Queue。没要必要自己去创建,获取Global dispatch queue使用就够了。

获取方法

dispatch_queue_t mainDispatchQueue = dipatch_get_main_queue();

dispatch_queue_t globalDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

Global dispatch queue有四个执行优先级,DISPATCH_QUEUE_PRIORITY_HIGH、DISPATCH_QUEUE_PRIORITY_DEFAULT,DISPATCH_QUEUE_PRIORITY_LOW,DISPATCH_QUEUE_PRIORITY_BACKGROUND.

例子:

/**在默认优先级的Global Dispatch Queue中执行Block**/

dipatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

/执行长时间处理的任务/

dispatch_async(dispatch_get_main_queue(),^{

在主线程可执行的处理,如用户界面更新。

});

});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gcd 应用 多线程