GCD队列 调度任务
1.队列的2大类型
1> 并发队列:可以同时执行多个任务 * 获取并发队列 并发队列都是全局的:dispatch_get_global_queue(0, 0),不需要管理内存
2> 串行队列:同一时间内,只能执行一个任务 * 获取串行队列
(1) 跟主线程相关联的队列 dispatch_get_main_queue(),不需要管理内存
(2) 手动创建队列,dispatch_queue_create("cn.com.queue", NULL),手动管理内存 dispatch_release(queue)
2.队列中任务的执行顺序:先进先出
3.开启任务
1> 开启同步任务 dispatch_sync(queue, ^{
});
2> 开启异步任务 dispatch_async(queue, ^{
});
4.迭代 dispatch_apply(10, queue, ^(size_t i) {
});
5.总结:
1> 队列的类型只决定任务是并发还是串行执行,不影响同步还是异步
2> 函数名称决定同步还是异步,dispatch_async代表异步,dispatch_sync代表同步
#pragma mark 异步串行
- (void)asyncChuanxing {
// 队列的类型只决定并发还是串行执行任务,并不影响同步还是异步
// 同步异步取决于函数名
// 手动创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("cn.com.queue", NULL);
dispatch_async(queue, ^{
NSLog(@"执行了一个异步任务-%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"执行了一个异步任务-%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"执行了一个异步任务-%@", [NSThread currentThread]);
});
// 释放队列
dispatch_release(queue);
}
#pragma mark 异步并发
- (void)asyncBingfa {
// 异步执行一个任务
// GCD默认提供了3个全局队列,都是并行队列
// 获取一个全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSLog(@"执行了一个异步任务-%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"执行了一个异步任务-%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"执行了一个异步任务-%@", [NSThread currentThread]);
});
}