方式一:宏定义
代码片段
#pragma mark - 宏定义
#ifndef dispatch_queue_async_safe
#define dispatch_queue_async_safe(queue, block)\
if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {\
block();\
} else {\
dispatch_async(queue, block);\
}
#endif
#ifndef dispatch_main_async_safe
#define dispatch_main_async_safe(block) dispatch_queue_async_safe(dispatch_get_main_queue(), block)
#endif
用法
dispatch_main_async_safe(^{
});
dispatch_queue_async_safe(dispatch_get_global_queue(0, 0), ^{
});
特点
- 优点:不用导入头文件
- 缺点:书写的时候block需要手动
方式二: 内联函数
代码段
#pragma mark - 内联函数
static inline void dispatch_async_on_main_queue(void(^block)(void)){
if (pthread_main_np()) {
block();
}else{
dispatch_async(dispatch_get_main_queue(), block);
}
}
static inline void dispatch_async_on_queue(dispatch_queue_t queue,void(^block)(void)){
if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {
block();
}else{
dispatch_async(queue, block);
}
}
使用
dispatch_async_on_main_queue(^{
});
dispatch_async_on_queue(dispatch_get_main_queue(), ^{
});
特点
- 有提示,直接enter能创建好block;
- 需要导入头文件 pthread.h
方式三:C函数
代码段
NSString * dispatchToMain(dispatch_block_t block);
NSString * dispatchToMain(dispatch_block_t block){
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:block];
[[NSOperationQueue mainQueue] addOperation:blockOp];
return [NSString stringWithFormat:@"%ld",(unsigned long)blockOp.hash];
}
用法
dispatchToMain(^{
});
特点
方式四: 改一下
#pragma mark - 内联函数
static inline void dispatch_async_on_queue(dispatch_queue_t queue,void(^block)(void)){
if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {
block();
}else{
dispatch_async(queue, block);
}
}
static inline void dispatch_async_on_main_queue(void(^block)(void)){
dispatch_async_on_queue(dispatch_get_main_queue(), block);
}
static inline void dispatchToMainQueue(dispatch_block_t block){
dispatch_async_on_queue(dispatch_get_main_queue(), block);
}
总结
- 第四种方便点, 不用导入pthread.h, 也有提示。