2016-09-27 64 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