ไวยากรณ์เป็นเพียง:
// 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
ภายในบล็อก)