Sözdizimi basitçe:
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
Not ekleme yukarıdaki sözdizimi secondsbir şekilde Double(biz NSEC ekleyerek alışmış esp beri) karmaşa kaynağı olarak görünmektedir. Yani "olarak saniye ekleyin Doubleçünkü sözdizimi eserler" deadlinebir olan DispatchTimeperde arkasında, bir var ve +bir alacak operatör Doubleve o sayıda saniye ekleyin DispatchTime:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
Eğer gerçekten, msn us veya NSEC farklı tamsayılar eklemek istiyorsanız, DispatchTimeaynı zamanda bir ekleyebileceğiniz DispatchTimeIntervalbir etmek DispatchTime. Bu, şunları yapabileceğiniz anlamına gelir:
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) {
os_log("500 msec seconds later")
}
DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(1_000_000)) {
os_log("1m μs seconds later")
}
DispatchQueue.main.asyncAfter(deadline: .now() + .nanoseconds(1_500_000_000)) {
os_log("1.5b nsec seconds later")
}
Bunların hepsi +, DispatchTimesınıftaki operatör için bu ayrı aşırı yük yöntemi nedeniyle sorunsuz bir şekilde çalışır .
public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime
Bir kişiye gönderilen bir görevi iptal etme konusunda nasıl bir soru soruldu. Bunu yapmak için kullanın DispatchWorkItem. Örneğin, bu, beş saniye içinde başlatılacak bir görev başlatır veya görünüm denetleyicisi kapatılır ve deinityeniden konumlandırılırsa görevi iptal eder:
class ViewController: UIViewController {
private var item: DispatchWorkItem?
override func viewDidLoad() {
super.viewDidLoad()
item = DispatchWorkItem { [weak self] in
self?.doSomething()
self?.item = nil
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: item!)
}
deinit {
item?.cancel()
}
func doSomething() { ... }
}
'De [weak self]yakalama listesinin kullanımına dikkat edin DispatchWorkItem. Güçlü bir referans döngüsünden kaçınmak için bu gereklidir. Ayrıca, bunun önleyici bir iptal yapmadığını, ancak daha önce yapmadıysa görevin başlamasını durdurduğunu unutmayın. Ancak, cancel()çağrı ile karşılaştığında zaten başlamışsa , blok yürütmeyi tamamlar ( isCancelledbloğun içinde manuel olarak kontrol etmiyorsanız ).