在Swift 3中,是否需要dispatch_once?
好的,所以我在Xcode 8中找到了新的SwiftyDispatchAPI。我在使用中很有趣DispatchQueue.main.async
,并且我一直Dispatch
在Xcode中的模块周围浏览以找到所有新的API。
但是我也要dispatch_once
确保单例创建和一次性设置之类的操作不会被执行多次(即使在多线程环境中也是如此)…并且dispatch_once
在新的Dispatch模块中找不到任何地方吗?
static var token: dispatch_once_t = 0func whatDoYouHear() {
print("All of this has happened before, and all of it will happen again.")
dispatch_once(&token) {
print("Except this part.")
}
}
回答:
从Swift 1.x开始,Swift一直dispatch_once
在幕后使用全局变量和静态属性执行线程安全的延迟初始化。
因此,static
var上面的代码已经被使用了dispatch_once
,这使其变得很奇怪(再次使用它作为另一个对象的令牌可能会产生问题dispatch_once
。实际上,dispatch_once
如果没有这种递归,实际上是没有安全的方法可以使用的,因此他们放弃了。)
,只需使用基于其构建的语言功能:
// global constant: SomeClass initializer gets called lazily, only on first uselet foo = SomeClass()
// global var, same thing happens here
// even though the "initializer" is an immediately invoked closure
var bar: SomeClass = {
let b = SomeClass()
b.someProperty = "whatever"
b.doSomeStuff()
return b
}()
// ditto for static properties in classes/structures/enums
class MyClass {
static let singleton = MyClass()
init() {
print("foo")
}
}
因此,如果您一直使用dispatch_once
一次 初始化 来产生某个值,那就太好了-您可以将该值设为要初始化的全局变量或静态属性。
但是,如果您dispatch_once
用来做不一定会产生结果的工作该怎么办?您仍然可以使用全局变量或静态属性来执行此操作:只需将变量的类型设为Void
:
let justAOneTimeThing: () = { print("Not coming back here.")
}()
而且,如果访问全局变量或静态属性来执行一次性工作对您来说并不适合-例如,您希望客户在使用库之前调用“初始化我”功能-只需包装一下访问功能:
func doTheOneTimeThing() { justAOneTimeThing
}
有关更多信息,请参见迁移指南。
以上是 在Swift 3中,是否需要dispatch_once? 的全部内容, 来源链接: utcz.com/qa/398743.html