2016-09-27 3 views
1

Ниже мой исходный код: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 была удалена, и я исправляю, что я могу просто смело назвать селектор без него? например:

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.

Пример со статическим вар:

//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 
Смежные вопросы