//宏定义单例模式
#define DEFINE_SINGLETON_FOR_HEADER(className) \
\
+ (className *)shared##className;
#define DEFINE_SINGLETON_FOR_CLASS(className) \
\
static className *shared##className = nil; \
+ (className *)shared##className { \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
shared##className = [[self alloc] init]; \
}); \
return shared##className; \
}
GCD常用用法
1. // "异步"执行
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 代码在后台线程执行,耗时的任务-> 从网络上下载数据
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI
});
});
2. // 队列 - GCD 提供了一个全局的对列,为所有应用程序服务的
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// "异步"执行
dispatch_async(q, ^{
// 代码在后台线程执行,耗时的任务-> 从网络上下载数据
dispatch_queue_t mainQ = dispatch_get_main_queue();
dispatch_async(mainQ, ^{
//更新UI
});
});
3. // 队列 - GCD 提供了一个全局的对列,为所有应用程序服务的
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// "多个"任务->执行
for (int i = 0; i < 5; i++) {
// "异步"执行
dispatch_async(q, ^{
// 代码在后台线程执行
NSLog(@"%@", [NSThread currentThread]);
});
}
4. dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 调度组,可以监管一系列相关的任务,等待所有任务完成后,统一得到通知
dispatch_group_t group = dispatch_group_create();
// 添加任务
dispatch_group_async(group, q, ^{
NSLog(@"download A %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
[NSThread sleepForTimeInterval:0.5f];
NSLog(@"download B %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"download C %@", [NSThread currentThread]);
});
// 统一获得最终的结果->dispatch_group_notify异步的,不会阻塞线程执行!
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//更新UI
});