iOS GCD
一、GCD是异步执行任务的技术之一,一般将应用程序中记叙的线程管理用的代码在系统级中是实现。
开发者只需要定义想要执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。
二、多线程编程
由于使用多线程的程序可以在某个线程和其他线程之间反复多次进行上下文切换,因此看上去就好像一个CPU核能够并行的执行多个线程一样,而且在具有多个CPU核的情况下,就不是“看上去像”了,而是真的提供了多个CPU核并行执行任务的多个线程的技术。
多线程编程容易发生各种编程问题:比如多个线程更新相同的资源会导致数据的不一致(数据竞争)、停止等待事件的线程会导致多个线程相互持续等待(死锁)、使用太多线程会消耗大量的内存资源等等。
尽管会有问题,但是为什么还要用呢?
在应用程序启动时,通过最先执行的线程,即主线程来描绘用户界面、处理用户触摸事件等,但是如果在该主线程中进行长时间的处理,就会妨碍主线程中被称为RunLoop的主循环的执行,从而导致不能跟新用户界面,应用程序的画面长时间停滞等问题。
三、GCD 的 API
1.Dispatch Queue
开发者要做的只是定义想要执行的任务并追加到适当的DispatchQueue中。
在Block中定义想要执行的任务,然后追加到Dispatch Queue中
Dispatch Queue是执行处理的等待队列,通过dispatch_async等API,在Block语法中记叙想要执行的处理并将其追加到Dispatch Queue中,Dispatch Queue按照追加的顺序(FIFO)执行处理。
另外,在执行处理时存在两种Dispatch Queue:
Dispatch Queue的种类
说明
Serial Dispatch Queue
等待现在执行中处理结束
Concurrent Dispatch Queue
不等待现在执行中处理结束
解释说明一下:
(1) Serial Dispatch Queue:就是要等待现在执行中处理结束后才可以进行下一个任务的执行处理,假如现在有blk1,blk2,blk3,在Serial Dispatch Queue中,那么同时执行处理数只能是一个,而且按按添加顺序FIFO进行处理,即先执行blk1,执行结束后再执行blk2,执行结束再进行blk3的执行。
(2) Concurrent Dispatch Queue:就是一个线程的执行不等待现在(当前)执行中的任务处理结束就可以开始另一个任务的执行处理。同样假如有blk1,blk2,blk3在Concurrent Dispatch Queue中,那么首先执行blk1,不管blk1是否执行处理结束,都开始执行后面的blk2,不管blk2是否执行结束,都开始执行后面的blk2。
这样虽然不用等待处理结束,可以并行执行多个任务处理,但是并行处理数取决于当前系统的状态,有它决定Concurrent Dispatch Queue中并行执行的处理数。所谓并行执行就是使用多个线程来同时执行多个处理任务(block中的执行任务)。
SerialDispatchQueue同时只能执行一个追加处理
ConcurrentDispatchQueue并行执行多个追加处理
虽然SerialDispatchQueue ConcurrentDispatchQueue受到系统资源的限制,但是用dispatch_queue_create可以生成任意多个Dispatch Queue
当生成多个SerialDispatchQueue时,各个SerialDispatchQueue将并行执行,虽然一个SerialDispatchQueue同时只能执行一个追加处理,但是如果将处理分别追加到4个
Serial Dispatch Queue中,各个Serial Dispatch Queue执行一个,即为同时执行4个处理
但是生成Serial Dispatch Queue的个数受系统限制
相关新闻>>
- 发表评论
-
- 最新评论 更多>>