iOS 易做图
一、易做图是异步执行任务的技术之一,一般将应用程序中记叙的线程管理用的代码在系统级中是实现。
开发者只需要定义想要执行的任务并追加到适当的Dispatch Queue中,易做图就能生成必要的线程并计划执行任务。
二、多线程编程
由于使用多线程的程序可以在某个线程和其他线程之间反复多次进行上下文切换,因此看上去就好像一个CPU核能够并行的执行多个线程一样,而且在具有多个CPU核的情况下,就不是“看上去像”了,而是真的提供了多个CPU核并行执行任务的多个线程的技术。
多线程编程容易发生各种编程问题:比如多个线程更新相同的资源会导致数据的不一致(数据竞争)、停止等待事件的线程会导致多个线程相互持续等待(死锁)、使用太多线程会消耗大量的内存资源等等。
尽管会有问题,但是为什么还要用呢?
在应用程序启动时,通过最先执行的线程,即主线程来描绘用户界面、处理用户触摸事件等,但是如果在该主线程中进行长时间的处理,就会妨碍主线程中被称为RunLoop的主循环的执行,从而导致不能跟新用户界面,应用程序的画面长时间停滞等问题。
三、易做图 的 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的个数受系统限制
为了避免多线程编程的问题之一---数据竞争,就可以使用Serial Dispatch Queue。
当想并行执行且不发生数据竞争等问题时就应该使用Concurrent Dispatch Queue。
[cpp]
//以下代码是两种生成Serial Dispatch Queue的方式
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("cn.edu.scnu.mySerialDispatchQueue", NULL);
// dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("cn.edu.scnu.mySerialDispatchQueue", DISPATCH_QUEUE_SERIAL);
//以下代码是两种生成Serial Dispatch Queue的方式
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("cn.edu.scnu.mySerialDispatchQueue", NULL);
// dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("cn.edu.scnu.mySerialDispatchQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_create,该方法中的第一个参数指定SerialDispatchQueue的名称,DispatchQueue的名称推荐使用应用程序ID之中逆序全程域名,第二个参数指定为NULL(或者DISPATCH_QUEUE_SERIAL)时即表示生成的是Serial Dispatch Queue,指定为DISPATCH_QUEUE_CONCURRENT时即表示生成的是Concurrent Dispatch Queue
[cpp]
//以下代码生成ConcurrentDispatchQueue
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("cn.edu.scnu.myConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myConcurrentDispatchQueue, ^{
NSLog(@"block on my ConcurrentDispatchQueue");
});
//以下代码生成ConcurrentDispatchQueue
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("cn.edu.scnu.myConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myConcurrentDispatchQueue, ^{
NSLog(@"block on my ConcurrentDispatchQueue");
});
2、MainDispatch Queue 和 Global Dispatch Queue
实际上不用特意生成DispatchQueue,系统也会提供几个给我们,就是Main DispatchQueue 和 Global Dispatch Queue
Main Dispatch Queue就是主线程中执行的Dispatch Queue,因为主线程只有一个,所以Main DispatchQueue自然就是 Serial Dispatch Queue
[cpp]
//获取Main Dispatch Queue
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
//获取Main Dispatch Queue
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
GlobalDispatch Queue是所有应用程序都能够使用的Concurrent Dispatch Queue,没有必要通过dispatch_queue_create方法逐个生成Concurrent Dispatch Queue,只要获
取GlobalDispatch Queue使用即可。
Global Dispatch Queue有四个优先级:High Priority,Default Priority,Low Priority,Background Priority
[cpp]
//获取高优先级的的Global Dispatch Queue
/*
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
*/
dispatch_queue_t globalDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
//第一个参数指定Global Dispatch Queue的优先级,第二个参数指定为0
//获取高优先级的的Global Dispatch Queue
/*
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
*/
dispatch_queue_t globalDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
//第一个参数指定Global Dispatch Queue的优先级,第二个参数指定为0
3、dispatch_set_target_queue
dispatch_queue_create函数生成的Dispatch Queue不管是Serial Dispatch Queue还是Concurrent Dispatch Queue,都是使用与默认优先级的Global Dispatch Queue相同执
行优先级的线程
如果想变更生成的Dispatch Queue的执行优先级要使用dispatch_set_target_queue方法。
[cpp]
dispatch_queue_t mySerialDispatch
补充:移动开发 , IOS ,