Những câu trả lời tôi đã nhìn thấy cho đến nay (1, 2, 3) khuyên bạn sử dụng GCD của dispatch_once
như sau:Làm cách nào để thực thi mã một lần và chỉ một lần trong Swift?
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()
Output:
This is printed only on the first call to test()
This is printed for each call to test()
Nhưng chờ một phút. token
là một biến, vì vậy tôi có thể dễ dàng làm điều này:
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()
Output:
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()
Vì vậy dispatch_once
là không sử dụng nếu chúng ta tôi có thể thay đổi giá trị của token
! Và biến token
thành hằng số không đơn giản vì nó cần loại UnsafeMutablePointer<dispatch_once_t>
.
Vì vậy, chúng ta có nên từ bỏ dispatch_once
trong Swift? Có cách nào an toàn hơn để thực thi mã chỉ một lần không?
Mục tiêu-C có cùng một vấn đề. Ý tưởng là đặt 'token' trong cùng phạm vi với khối' dispatch_once' (và đặt cho nó một tên tốt hơn như 'onceToken' và đặt nó ở phía trên khối' dispatch_once' để nó rất rõ ràng). – nhgrif
sau đó 'dispatch_once' không an toàn hơn là sử dụng biến boolean thông thường. – Eric
http://stackoverflow.com/q/25354882/2792531 – nhgrif