dispatch_once转换Swift 3

以下是我的原始代码:

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已被删除,我正确地说,我可以安全地调用select器没有它? 例如:

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) if self.unauthorized { self.performSelector(#selector(self.displayUnauthorizedMessage), withObject: nil, afterDelay: 0.5) } } 

它是否正确?

那么这不是一回事。 我不确定你的确切意图是什么,但我认为你所做的是过分的。

dispatch_once是为了确保代码只执行一次,即使多个线程正在调用一个函数,它通常用于初始化函数中的variables,这个函数经常被调用,也可能来自不同的线程。

由于viewDidAppear将始终在主线程中调用,并且您只是希望在第一次访问视图时显示未经授权的视图,我build议您做一个简单的实例boolvariablesunauthorizedMessageShown ,在第一次访问时将其设置为true,并检查函数。

通常,当你转换为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 } 

dispatch_once在Swift中不再可用,所以你应该使用懒惰的初始化或静态属性。 通过这种方式,您将获得与dispatch_once提供的相同的线程安全性和调用一次性保证。

静态variables示例:

 //init static var private static var callOne: () { print("Call one") }() //call Class.callOne 

示例与懒惰var:

 //init lazy var lazy var callOne: () = { print("Call one") }() //call _ = self.callOne