标签:
1.GCD的核心是:将任务添加到队列;
2.GCD中的任务是使用block封装的;
3.任务的取出遵循先进先出,后进后出的原则;GCD会自动的将队列中的人物取出,放到对应的线程中执行;
4.GCD会自动的管理线程的生命周期(创建线程,调度任务,线程销毁);线程在一定的时间内可以复用;
5.GCD的队列分为两大类型:
串行队列(serial dispatch queue):任务一个接一个执行;
并发队列(concurrent):多个任务同时执行(自动开启多个线程),只有在异步的情况下才有效果.
6.主队列(全局串行队列):主队列的任务,只有主线程空闲的时候才会被调度,主队列中的任务要在主线程执行;
程序启动时就创建了主队列,使用的时候不需要创建,直接获取;
7.全局队列(并发队列):程序启动就创建好,直接get获取,不需要我们内存管理;
=====================
//自定义串行队列
// 参数2 : 队列的属性.决定了队列的类型,即是串行还是并行(并发)
dispatch_queue_t queue = dispatch_queue_create("CZ", DISPATCH_QUEUE_SERIAL);
//自定义并发队列
dispatch_queue_t queue = dispatch_queue_create("CZ", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t global_queue = dispatch_get_global_queue(0, 0);
//获取主队列(串行):
dispatch_queue_t queue = dispatch_get_main_queue();
异步执行:新开线程,在新线程中执行
dispatch_async(queue, ^{
}
同步执行:在当前线程中执行,有可能是在子线程,也有可能是在主线程;
dispatch_sync(queue, ^{
// 查看当前的线程
NSLog(@"登陆 %@",[NSThread currentThread]);
});
dispatch_sync(dispatch_get_main_queue(), ^{
// 查看当前的线程
NSLog(@"通知用户 %@",[NSThread currentThread]);
});
// 查看当前的线程
NSLog(@"%d %@",i,[NSThread currentThread]);
});
队列和执行方法的总结:
并发队列--同步执行:不开线程,顺序执行;
串行队列--同步执行:不开线程,顺序执行;
串行队列--异步执行:新开1个线程,顺序执行;
并发队列--异步执行:每次开多个线程,线程数有GCD决定.
主队列 ---异步执行:不开线程,顺序执行;
朱队列----同步执行:不允许,会死锁;
=================================
一次性执行,设计单利
// onceToken 是有一个初始值
// 第一次执行的时候,会判断是否是初始值,如果是初始值,就执行block内部的代码
// 第一次执行完成之前,会重置初始值为非0;
+ (instancetype)sharedAccountManager
{
// 定义静态的空对象
static AccountManager *manager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[AccountManager alloc] init];
});
return manager;
}
延时操作:
void dispatch_after(
dispatch_time_t when,
dispatch_queue_t queue,
dispatch_block_t block);
/*
参数1 : 操作延迟的时间
参数2 : 操作添加的队列
参数3 : 执行那个操作
*/
// 参数1 : 精确到纳秒
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));
// 参数2
dispatch_queue_t queue = dispatch_get_main_queue();
// 参数3
void (^task)() = ^{
// 查看当前的线程
NSLog(@"%@",[NSThread currentThread]);
};
// 延迟多少纳秒,在哪个队列中执行那个操作
dispatch_after(when, queue, task);
调度组的原理:
每一个任务都有一个标记,任务完成标记移除,如果标记全部移除,会执行监听;
// 参数1 : 调度组
dispatch_group_t group = dispatch_group_create();
// 参数2 : 队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, queue, ^{
// 模拟网络延迟
[NSThread sleepForTimeInterval:1.0];
// 查看当前的线程
NSLog(@"下载图片1 %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
// 模拟网络延迟
[NSThread sleepForTimeInterval:0.5];
// 查看当前的线程
NSLog(@"下载图片2 %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
// 查看当前的线程
NSLog(@"下载图片3 %@",[NSThread currentThread]);
});
// 监听图片是否下载完成
dispatch_group_notify(group, queue, ^{
// 查看当前的线程
NSLog(@"监听是否全部下载完成 %@",[NSThread currentThread]);
});
标签:
原文地址:http://blog.csdn.net/u011146511/article/details/51348750