iOS GCD

来源:互联网 发布:android 内存管理源码 编辑:程序博客网 时间:2024/06/05 13:28

首先说下GCD是什么, GCD即Great Central Dispatch, 意即伟大的中央调度器, 从名字中可以看出它是iOS中用于调度任务的.
下面先了解下使用GCD的背景知识:
进程: 进程是程序在计算机上的一次执行活动,打开一个app,就开启了一个进程,可包含多个线程。
线程: 独立执行的代码段,一个线程同时间只能执行一个任务,反之多线程并发就可以在同一时间执行多个任务。
iOS程序中,主线程(又叫作UI线程)主要任务是处理UI事件,显示和刷新UI,(只有主线程有直接修改UI的能力)耗时的操作放在子线程(又叫作后台线程、异步线程)。在iOS中开子线程去处理耗时的操作,可以有效提高程序的执行效率,提高资源利用率。但是开启线程会占用一定的内存,(主线程的堆栈大小是1M,第二个线程开始都是512KB,并且该值不能通过编译器开关或线程API函数来更改)降低程序的性能。所以一般不要同时开很多线程。参考

1. 同步/异步

同步:多个任务情况下,任务A执行结束,才执行任务B。只存在一个线程那就是主线程。

异步:多个任务情况下,任务A正在执行,同时执行任务B。任务B不用等待任务A执行结束。存在多条线程。

2. 并发/并行

并行:指两个或多个事件在同一时刻发生。多核CPU同时开启多条线程供多个任务同时执行,互不干扰。

并发:指两个或多个事件在同一时间间隔内发生。可以在某条线程和其他线程之间反复多次进行上下文切换,看上去就好像一个CPU能够同时异步执行多个线程一样。其实是伪异步。在同一线程,任务A先执行了20%,然后A停止,任务B重新开始接管线程开始执行。

3. GCD中几种队列:

  1. The main queue(主线程串行队列): 与主线程功能相同,提交至Main queue的任务会在主线程中执行,Main queue 可以通过dispatch_get_main_queue()来获取。
  2. Global queue(全局并发队列): 全局并发队列由整个进程共享,有高、中(默认)、低、后台四个优先级别。Global queue 可以通过调用dispatch_get_global_queue函数来获取(可以设置优先级)
  3. Custom queue (自定义队列): 可以为串行,也可以为并发。Custom queue 可以通过dispatch_queue_create()来获取;
  4. Group queue (队列组):将多线程进行分组,最大的好处是可获知所有线程的完成情况。Group queue 可以通过调用dispatch_group_create()来获取,通过dispatch_group_notify,可以直接监听组里所有线程完成情况。

4. GCD几个 “队列优先级”

#define DISPATCH_QUEUE_PRIORITY_HIGH 2#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0#define DISPATCH_QUEUE_PRIORITY_LOW (-2)#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

从上到下优先级依次降低

简单用法示例:
为了避免在处理一些耗时操作(例如网络访问, I/O)的时候界面卡死, 通常会在一个后台进程中处理这些操作, 操作完成后通知主线程刷新界面:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{       // 耗时的操作       dispatch_async(dispatch_get_main_queue(), ^{           // 更新界面       });   });

未完

0 0
原创粉丝点击