以下是我的原始代码:
var checkUnauthorizedToken: dispatch_once_t = 0
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
dispatch_once(&checkUnauthorizedToken) {
if self.unauthorized {
self.performSelector(#selector(self.displayUnauthorizedMessage), withObject: nil, afterDelay: 0.5)
}
}
}
因为dispatch_once
已被删除,我更正说我可以安全地调用选择器而不用它? e.g:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if self.unauthorized {
self.performSelector(#selector(self.displayUnauthorizedMessage), withObject: nil, afterDelay: 0.5)
}
}
这是对的吗?
答案 0 :(得分:3)
嗯,这不是一回事。我不确定你的确切意图是什么,但我认为你所做的是矫枉过正。
dispatch_once
是为了确保代码只执行一次,即使多个线程正在调用一个函数,它通常用于初始化经常调用的函数中的变量,也可能来自不同的线程。
由于viewDidAppear
将始终在主线程中调用,并且您只想在第一次访问视图时显示未经授权的视图,我建议您执行一个简单的实例bool变量unauthorizedMessageShown
,设置它在第一次访问时为真,并在函数中检查。
答案 1 :(得分:1)
通常,当你转换为swift3时,它会自动转换为这样的东西:
lazy var checkUnauthorizedToken: () = {
if self.unauthorized {
self.performSelector(#selector(self.displayUnauthorizedMessage), withObject: nil, afterDelay: 0.5)
}
}()
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
_ = self.checkUnauthorizedToken
}
答案 2 :(得分:0)
dispatch_once
,因此您应该使用延迟初始化或静态属性。通过这种方式,您将获得与dispatch_once
提供的相同的线程安全性和一次性保证。
静态var的示例:
//init static var
private static var callOne: () {
print("Call one")
}()
//call
Class.callOne
lazy var:
的示例//init lazy var
lazy var callOne: () = {
print("Call one")
}()
//call
_ = self.callOne