Ответы, которые я видел до сих пор (1, 2, 3) рекомендуем использовать GCD dispatch_once
, таким образом:
var token: dispatch_once_t = 0
func test() {
dispatch_once(&token) {
print("This is printed only on the first call to test()")
}
print("This is printed for each call to test()")
}
test()
Выход:
This is printed only on the first call to test()
This is printed for each call to test()
Но подождите минуту. token
- переменная, поэтому я мог бы легко сделать это:
var token: dispatch_once_t = 0
func test() {
dispatch_once(&token) {
print("This is printed only on the first call to test()")
}
print("This is printed for each call to test()")
}
test()
token = 0
test()
Выход:
This is printed only on the first call to test()
This is printed for each call to test()
This is printed only on the first call to test()
This is printed for each call to test()
Итак, dispatch_once
бесполезно, если я могу изменить значение token
! И превращение token
в константу не так просто, как нужно для типа UnsafeMutablePointer<dispatch_once_t>
.
Итак, мы должны отказаться от dispatch_once
в Swift? Есть ли более безопасный способ выполнить код только один раз?