dispatch_once转换Swift 3

时间:2016-09-27 13:05:15

标签: ios swift swift3

以下是我的原始代码:

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)
        }
    }

这是对的吗?

3 个答案:

答案 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)

Swift中不再提供

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