Cú pháp đơn giản là:
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
Lưu ý, cú pháp trên seconds
như thêm vào Double
dường như là một nguồn gây nhầm lẫn (đặc biệt vì chúng ta đã quen với việc thêm nsec). Double
Cú pháp "thêm giây là " hoạt động vì deadline
là một DispatchTime
và, đằng sau hậu trường, có một +
toán tử sẽ mất một Double
và thêm nhiều giây đó vào DispatchTime
:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
Nhưng, nếu bạn thực sự muốn thêm một số nguyên msec, μs hoặc nsec vào DispatchTime
, bạn cũng có thể thêm a DispatchTimeInterval
vào a DispatchTime
. Điều đó có nghĩa là bạn có thể làm:
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")
}
Tất cả đều hoạt động trơn tru vì phương thức quá tải riêng biệt này cho +
toán tử trong DispatchTime
lớp.
public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime
Nó được hỏi làm thế nào một người đi về việc hủy bỏ một nhiệm vụ được gửi đi. Để làm điều này, sử dụng DispatchWorkItem
. Ví dụ: điều này bắt đầu một tác vụ sẽ kích hoạt trong năm giây hoặc nếu bộ điều khiển chế độ xem bị loại bỏ và giải phóng, nó deinit
sẽ hủy tác vụ:
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() { ... }
}
Lưu ý việc sử dụng [weak self]
danh sách chụp trong DispatchWorkItem
. Điều này là cần thiết để tránh một chu kỳ tham chiếu mạnh mẽ. Cũng lưu ý rằng điều này không thực hiện hủy bỏ ưu tiên, mà chỉ dừng nhiệm vụ bắt đầu nếu nó chưa được thực hiện. Nhưng nếu nó đã bắt đầu vào thời điểm nó gặp cancel()
cuộc gọi, khối sẽ hoàn thành việc thực hiện (trừ khi bạn kiểm tra thủ công isCancelled
bên trong khối).