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 seconds
bir ş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" deadline
bir olan DispatchTime
perde arkasında, bir var ve +
bir alacak operatör Double
ve 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, DispatchTime
aynı zamanda bir ekleyebileceğiniz DispatchTimeInterval
bir 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 +
, DispatchTime
sı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 deinit
yeniden 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 ( isCancelled
bloğun içinde manuel olarak kontrol etmiyorsanız ).