2016-09-27 66 views
1

下面是我的原代码:dispatch_once转换斯威夫特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已被删除,我纠正我可以安全地调用选择无过?例如:

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

这是正确的吗?

回答

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

那么它是不一样的东西。我不确定你的确切意图是什么,但我认为你所做的只是矫枉过正。

dispatch_once是确保代码只执行一次,即使多个线程调用的函数,它通常用于在一个经常,也许称为来自不同的线程函数初始化变量。

由于viewDidAppear将始终在主线程中调用,并且您只想在第一次访问视图时显示未经授权的视图我建议您执行一个简单实例bool变量unauthorizedMessageShown,在第一次访问时将其设置为true并检查在函数中。

0

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

实施例的静态VAR:

//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