GCD详解及实现

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(),^{
在主线程可执行的处理,如用户界面更新。
});
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

house.zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值