iOS - 主线程调度在应用中的小技巧

本文介绍四种GCD异步安全调用的方法:宏定义、内联函数、C函数及改进版内联函数。每种方法都有其优缺点,如宏定义无需导入头文件但需手动创建block;内联函数提供良好提示且简化block创建,但需导入pthread.h;C函数则需在.h和.m文件中声明与实现;改进版内联函数综合了便捷性和提示功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方式一:宏定义

代码片段

#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函数

代码段

//xxx.h中申明
NSString * dispatchToMain(dispatch_block_t block);
//xxx.m中实现
NSString * dispatchToMain(dispatch_block_t block){
    NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:block];
    [[NSOperationQueue mainQueue] addOperation:blockOp];
    return [NSString stringWithFormat:@"%ld",(unsigned long)blockOp.hash];
}

用法

  dispatchToMain(^{
    });

特点

  • 需要完整的.h和.m文件中书写

方式四: 改一下

#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, 也有提示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值