美文网首页
Swift3 dispatch_once 单列废弃的解决办法

Swift3 dispatch_once 单列废弃的解决办法

作者: 西充小凡哥 | 来源:发表于2019-05-15 16:15 被阅读0次

在Swift中如果想搞类的单例模式,那么在初始化的时候一般会使用just one time执行的方式,我们使用dispatch_once_t配合调用dispatch_once方法,一般的代码如下:

static var token: dispatch_once_t = 0
func whatDoYouHear() {
    print("All of this has happened before, and all of it will happen again.")
    dispatch_once(&token) {
        print("Except this part.")
    }
}

不过在Swift3中会提示此法行不通,dispatch_xxx已废弃,use lazily initialized globals instead.

原来自从swift 1.x开始swift就已经开始用dispatch_one机制在后台支持线程安全的全局lazy初始化和静态属性.所以static var背后已经在使用dispatch_once了.网友的解释是:

So the static var above was already using dispatch_once, which makes it sort of weird (and possibly problematic to use it again as a token for another dispatch_once. In fact there's really no safe way to use dispatch_once without this kind of recursion, so they got rid of it. Instead, just use the language features built on it

所以现在的swift3中干脆把dispatch_once显式的取消了.

我们再Swift3中若要想实现原来dispatch_once的机制可以用以下几种办法:

1.使用全局常量

let foo = SomeClass()

1
2.带立即执行闭包初始化器的全局变量:

var bar: SomeClass = {
    let b = SomeClass()
    b.someProperty = "whatever"
    b.doSomeStuff()
    return b
}()

3.类,结构,枚举中的静态属性:

class MyClass {
    static let singleton = MyClass()
    init() {
        print("foo")
    }
}

你还可以直接创建一个全局的变量或静态属性来达到没有结果的just one time:

let justAOneTimeThing: () = {
    print("Not coming back here.")
}()

如果你觉得这都不和你的胃口,你可以在需要调用justAOneTimeThing的地方直接调用它就是啦:

func doTheOneTimeThing() {
    justAOneTimeThing
}

所以在Swift3中推荐使用如下方法来完成一个单例:

class Foo{
    private static let sharedInstance = Foo()
    class var sharedFoo {
        return sharedInstance
    }
}


作者:大熊猫侯佩
来源:CSDN
原文:https://blog.csdn.net/mydo/article/details/52635754
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章

  • Swift3 dispatch_once 单列废弃的解决办法

    在Swift中如果想搞类的单例模式,那么在初始化的时候一般会使用just one time执行的方式,我们使用di...

  • Swift 3

    把之前的项目适配Swift3。满满的恶意。 dispatch_once 在使用swizzle的时候一定会用到,但是...

  • Swift 3.0 项目升级实战

    dispatch_once方法废弃,可以使用如下两种方式实现: public extension Dispatch...

  • 多线程开发

    异步 延迟 异步延迟 once dispatch_once在Swift中已经被废弃,可以使用类型属性或者全局变量\...

  • [iOS] 安全唯一的单例模式

    Swift swift 3.0中废弃了dispatch_once,这里只记录一个标准的单例写法,具体相关的内容,可...

  • Swift中的dispatch_once

    我们都知道,从swift3.0开始,dispatch_once被废弃了,而是开始推荐大家使用全局let变量,懒加载...

  • Swift学习之多线程

    一、异步 二、延迟执行 三、多线程-once dispatch_once在Swift中已经被废弃,可以用类型属性或...

  • Swift-没有dispatch_once实现只调用一次

    早在Swift 3的时候,dispatch_once就被苹果废弃了,并且推荐使用懒初始化全局变量方案代替。 官方推...

  • [Swift3.0]单例模式(学习)

    swift 3.0中废弃了dispatch_once,这里只记录一个标准的单例写法,具体相关的内容,可以看看这篇文...

  • swift3 popViewController 的改变

    在swift2.x中 有这个方法 但是在swift3 就会出现这个警告 解决办法为: Swift 3 大的改动之一...

网友评论

      本文标题:Swift3 dispatch_once 单列废弃的解决办法

      本文链接:https://www.haomeiwen.com/subject/sttmaqtx.html