GCD(Grand Central Dispatch)的 dispatch queues 是一个实现多任务的很好的工具。Dispatch queues 让你能够方便的使用blocks,不管你想要去调用同步或异步。你可以实现几乎所有的以前你通过separate 的threads完成的任务。相对thread的code 而言,dispatch queues的优点是更简单和更有效率。
这章节提供了dispatch queues的详细介绍,所有关于怎么样使用他们去执行普通任务的信息。
一、关于Dispatch Queues
Dispatch Queues 是一个简单实现实现异步和并发任务的方法。A dispatch queue is an object-like structures that manages the tasks you submit to it.所有的dispatch queue都是先进先出的数据结构
Serial queues:每次只执行一个任务,并且先进先出。如果想通过这个实现并发可以创建多个serial queue 。但是如果希望实现许多并发则建议使用并发queues。
dispatch_queue_t queue;
queue = dispatch_queue_create("com.example.MyQueue",NULL);
Concurrent Queue :(global dispatch queue) 并发,但是仍然按加进队列的顺序启动。并发执行的任务在确定的线程中(被并发队列管理着的)。具体的执行的线程数由系统决定,是动态的。In IOS5 and later ,我们能够自己创建并发队列通过设定为DISPATCH_QUEUE_CONCURRENT 的类型
系统提供了4个并发队列 是全局的,他们只是优先等级不同。因为是全局的,我们不在需要创建了。通过dispatch_get_global_queue
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
DISPATCH_QUEUE_PRIORITY_HIGH 和DISPATCH_QUEUE_PRIORITY_LOW ,DISPATCH_QUEUE_PRIORITY_BACKGROUND
note:第二个参数以后在解释,现在我们只要传0得参数就行了。
Main dispatch queue :主队列是一个全局可获取在应用主线程中执行任务的的窜行队列。 通过run loop 将我们要执行的任务加进主线程。如果不是cocoa的应用,也不想特别的创建run loop ,你必须通过dispatch_main方法
dispatch_get_main_queue.
二,获取运动时的队列
你可以通过dispatch_get_current_queue获取运行时的队列:
1.
dispatch_queue_t currentQueue = dispatch_get_current_queue();
如果在队列执行任务中调用,返回执行此任务的队列;如果在主线程中调用,将返回主队列;如果在一般线程(非主线程线程非队列执行任务)中调用,返回DISPATCH_QUEUE_PRIORITY_DEFAULT全局队列。
三、在队列中运行任务
异步
dispatch_async(aQueue,^{
//do somethings
});
同步
dispatch_sync(aQueue,^{
});
四、Dispatch Queue的内存管理
除了系统定义的Dispatch Queue,我们自定义的Dispatch Queue需要手动的管理它的内存。
dispatch_retain dispatch_release