Swift-DispatchQueue.once

本文详细介绍了Swift中DispatchQueue.once的用法,通过这个一次性执行的队列,可以确保在多线程环境中某个代码块只执行一次,避免了初始化资源时的并发问题。示例代码展示了其在实例化单例、配置设置等方面的实践应用。

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


// https://stackoverflow.com/a/39983813/235297
extension DispatchQueue {
    private static var _onceTracker = [String]()

    public class func once(file: String = #file, function: String = #function, line: Int = #line, block:()->Void) {
        let token = file + ":" + function + ":" + String(line)
        once(token: token, block: block)
    }

    /**
    Executes a block of code, associated with a unique token, only once.  The code is thread safe and will
    only execute the code once even in the presence of multithreaded calls.

    - parameter token: A unique reverse DNS style name such as com.vectorform.<name> or a GUID
    - parameter block: Block to execute once
    */
    public class func once(token: String, block:()->Void) {
        objc_sync_enter(self)
        defer { objc_sync_exit(self) }


        if _onceTracker.contains(token) {
            return
        }

        _onceTracker.append(token)
        block()
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值