구문은 다음과 같습니다.
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
위의 seconds
a 를 추가하는 구문은 Double
혼란의 원인 인 것으로 보입니다 (nsec을 추가하는 데 익숙했기 때문에 특히 그렇습니다). 즉 "로 초를 추가 Double
하기 때문에 구문 작품" deadline
인 DispatchTime
무대 뒤에서하는 존재이며, +
걸릴 것 운영자 Double
와에 많은 초를 추가가 DispatchTime
:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
당신이 정말로에, 밀리 μS 또는 NSEC의 정수를 추가 할 경우에, DispatchTime
당신은 또한을 추가 할 수 있습니다 DispatchTimeInterval
A를 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
. 예를 들어, 5 초 내에 실행되는 작업을 시작하거나, 뷰 컨트롤러가 해제 및 할당 해제되면 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
내부를 수동으로 확인하지 않는 한 블록 실행이 완료됩니다 .