Swift 3 GCD API 更改后的dispatch_once

2024-05-30

新语法是什么dispatch_once在语言版本 3 中进行更改后的 Swift 中?旧版本如下。

var token: dispatch_once_t = 0
func test() {
    dispatch_once(&token) {
    }
}

These 对 libdispatch 进行了更改 https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md那些被制作的。


虽然使用惰性初始化全局变量对于某些一次性初始化有意义,但对于其他类型则没有意义。对于单例之类的事情使用惰性初始化全局变量很有意义,对于保护 swizzle 设置之类的事情没有多大意义。

这是dispatch_once 的 Swift 3 风格实现:

public extension DispatchQueue {

    private static var _onceTracker = [String]()

    /**
     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:@noescape(Void)->Void) {
        objc_sync_enter(self); defer { objc_sync_exit(self) }

        if _onceTracker.contains(token) {
            return
        }

        _onceTracker.append(token)
        block()
    }
}

这是一个示例用法:

DispatchQueue.once(token: "com.vectorform.test") {
    print( "Do This Once!" )
}

或使用 UUID

private let _onceToken = NSUUID().uuidString

DispatchQueue.once(token: _onceToken) {
    print( "Do This Once!" )
}

由于我们目前正处于从 swift 2 到 3 的过渡时期,以下是 swift 2 实现的示例:

public class Dispatch
{
    private static var _onceTokenTracker = [String]()

    /**
     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 token: String, @noescape block:dispatch_block_t) {
        objc_sync_enter(self); defer { objc_sync_exit(self) }

        if _onceTokenTracker.contains(token) {
            return
        }

        _onceTokenTracker.append(token)
        block()
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 3 GCD API 更改后的dispatch_once 的相关文章

随机推荐

  • Java EE7 中 Qualifier 中的 @Nonbinding 注释的目的是什么?

    我正在阅读CDIJavaEE 7 中的注入特别是使用 Qualifier and Produces注入一个custom Data type变成一颗豆子 我有以下代码取自JBoss 文档 http docs jboss org weld re
  • 应如何在 WinForms GUI 控件和客户端类之间同步数据?

    什么方法被认为是保持 GUI 控件内的数据结构与应用程序维护的数据结构同步的 标准 例如 在 WinForms 中 如果创建一个 ListView 实例 而不是将其指向表示要出现在列表中的项目的数据结构 则必须以编程方式实例化 ListVi
  • 字符串生成器最大长度

    我想知道字符串生成器 或字符串缓冲区 的最大容量是多少 我的 Android 应用程序中有一个静态变量 它应该保存日志字符串 它最多可以容纳 130 行和大约 10000 个字符 我如果我附加更多内容 但它只是不显示 没有错误 没有例外 所
  • Java 使用服务器证书对 jar 进行签名

    是否可以使用服务器证书来签署 java web start 应用程序 我想知道的是它是否有效 我的服务器有一个受信任的证书 并且我想重复使用同一证书来签署应用程序 现在 我有这样的警告 此 jar 包含其签名者证书的 ExtendedKey
  • 检测对给定 JavaScript 事件的支持?

    我有兴趣使用 JavaScript hashchange 事件来监视 URL 片段标识符的更改 我知道非常简单的历史 http code google com p reallysimplehistory 以及用于此目的的 jQuery 插件
  • 将 Json 数据返回给 Ajax 调用

    我在 MVC 中有一个方法 我将其发布到它 并且我需要返回一些数据以进行处理 这是我发布到的 MVC 方法 返回值是 json 数据 HttpPost public JsonResult GetCalculateAmortizationSc
  • 数据库设计:类别在自己的表中?

    我正在将几个数据库重新设计成一个综合数据库 并且我注意到旧数据库的先前设计者喜欢将类别存储在自己的表中 例如 假设有一个表boats bid integer bname string color integer 并且在应用程序中有一个下拉框
  • 获取UIButton的UITableViewCell?

    我正在尝试使用UIButton 它位于自定义的UITableViewCell类称为GFHomeCell The GFHomeCell has a postID属性 我想在准备继续时发送该属性 我设置了一个在按下按钮时运行的方法 但是 在按下
  • 我可以检查某个 URL 上是否存在文件吗?

    我知道我可以在本地文件系统上检查文件是否存在 if File Exists path 我可以检查特定的远程 URL 吗 如果您尝试验证网络资源是否存在 我建议使用HttpWebRequest班级 这将允许您发送HEAD向相关 URL 发出请
  • 包可以跨 Anaconda 环境共享吗?

    My anaconda目录占用了太多的磁盘空间 10GB 尽管我只有五个环境并且已经运行conda clean 我发现当我尝试创建一个新的 conda 环境时 Anaconda 显示了一个很长的要下载的包列表 其中似乎包括完整的科学 Pyt
  • 在 C++ 中循环两个向量

    我正在尝试循环使用相同基类的两个向量 请参阅下面的示例 for const Animal animal LOOP THROUGH TWO VECTORS HERE access animal functions variables 在上面的
  • 过滤表内容

    我正在寻找实现一个绑定来搜索 HTML 表 我考虑过实现自定义绑定并利用 jQuery 来完成繁重的工作 自定义绑定方面是为了使其在我的解决方案中普遍可访问 我当前的解决方案仅由 jQuery 组成 不使用任何 KnockoutJS 功能
  • 如何构建一个不链接到 musl libc 的 go 可执行文件

    So 官方的 Go 构建容器基于 Alpine 高山用途musl https www musl libc org 作为 libc 而不是 glibc 我需要在容器中构建一个可以在使用 glibc 的 Ubuntu 上运行的 Go 可执行文件
  • 找不到 -lDoubleConversion 的库

    我尝试在 XCode 上构建 但是ld library not found for lDoubleConversion发生错误 我可以建造react native run ios 这可行 但 XCode 无法构建 ld 警告 找不到选项 L
  • 是否可以通过 UIActivityViewController 共享图像并保留 exif 数据?

    我有一个应用程序 可以通过以下方式将图像保存到相机胶卷中的自定义相册中 library writeImageToSavedPhotosAlbum newTestImage CGImage metadata metadata completi
  • 在 C# 中转换为反射类型

    考虑以下代码 object objFoo MakeFoo object MakeFoo return new Foo MethodInfo methodInfo typeof Program GetMethod Baz Foo Baz re
  • 将所有 BigDecimal 运算设置为特定精度?

    我的Java程序以高精度计算为中心 需要精确到至少120位小数 因此 程序中所有非整数都将由 BigDecimal 表示 显然 我需要指定 BigDecimal 的舍入精度 以避免无限小数表达式等 目前 我发现必须在 BigDecimal
  • 关闭 python 后让进程保持运行

    我希望在终止原始进程后继续运行进程 以下代码在终止原始进程后不会使其进程保持运行 args yes Popen args shell True stdout None stdin None stderror None 我已经尝试了我能想到的
  • ASP.net获取硬件信息

    如果我创建一个 ASP net 页面 我是否能够获取当前用户的 CPUID 和 BIOS 序列号 还是出于安全原因不允许这样做 我目前有一个获取这些值的 Visual Basic net 应用程序 我只是想知道是否可以在网页上执行相同的操作
  • Swift 3 GCD API 更改后的dispatch_once

    新语法是什么dispatch once在语言版本 3 中进行更改后的 Swift 中 旧版本如下 var token dispatch once t 0 func test dispatch once token These 对 libdi