वाक्य विन्यास बस है:
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
ध्यान दें, उपर्युक्त वाक्यविन्यास seconds
एक Double
भ्रम के स्रोत के रूप में लगता है (क्योंकि हम nsec जोड़ने के आदी थे)। वह "जोड़ सेकंड Double
" के रूप में "वाक्य रचना काम करती है क्योंकि deadline
एक है DispatchTime
, पर्दे के पीछे, एक +
ऑपरेटर है जो एक ले जाएगा Double
और उस कई सेकंड को जोड़ देगा DispatchTime
:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
लेकिन, यदि आप वास्तव में, msec μs, या करने के लिए nsec के एक पूर्णांक संख्या जोड़ना चाहते हैं DispatchTime
, तो आप भी एक जोड़ सकते हैं DispatchTimeInterval
एक करने के लिए DispatchTime
। इसका मतलब है कि आप कर सकते हैं:
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")
}
वर्ग +
में ऑपरेटर के लिए इस अलग अधिभार विधि के कारण ये सभी मूल रूप से काम करते हैं DispatchTime
।
public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime
यह पूछा गया था कि किसी को भेजे गए कार्य को रद्द करने के बारे में कैसे जाना जाता है। ऐसा करने के लिए, का उपयोग करें DispatchWorkItem
। उदाहरण के लिए, यह एक कार्य शुरू करता है जो पाँच सेकंड में आग लगा देगा, या यदि दृश्य नियंत्रक को खारिज कर दिया जाता है और उसे हटा दिया जाता है, तो deinit
यह कार्य रद्द कर देगा:
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() { ... }
}
में [weak self]
कैप्चर सूची के उपयोग पर ध्यान दें DispatchWorkItem
। एक मजबूत संदर्भ चक्र से बचने के लिए यह आवश्यक है। यह भी ध्यान दें कि यह एक पूर्व-निरस्तीकरण नहीं करता है, बल्कि कार्य को शुरू करने से रोकता है यदि यह पहले से ही नहीं है। लेकिन अगर यह cancel()
कॉल शुरू होने तक पहले ही शुरू हो गया है , तो ब्लॉक अपने निष्पादन को समाप्त कर देगा (जब तक कि आप मैन्युअल रूप isCancelled
से ब्लॉक के अंदर जांच नहीं कर रहे हैं )।