ไวยากรณ์เป็นเพียง:
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
หมายเหตุไวยากรณ์ข้างต้นของการเพิ่มsecondsเป็นDoubleน่าจะเป็นแหล่งที่มาของความสับสน (ESP ตั้งแต่เราได้คุ้นเคยกับการเพิ่ม nsec บริการ) "เพิ่มวินาทีในขณะที่Double" ไวยากรณ์ใช้งานได้เนื่องจากdeadlineเป็นDispatchTimeและหลังฉากมี+โอเปอเรเตอร์ที่จะใช้เวลาDoubleและเพิ่มจำนวนวินาทีนั้นในDispatchTime:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
แต่ถ้าคุณอยากจะเพิ่มเต็มจำนวนมิลลิวินาที, ไมโครวินาทีหรือ 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ภายในบล็อก)