Swift 3, 4 및 5에서 dispatch_after GCD를 작성하는 방법
Swift 2에서는 dispatch_after
그랜드 센트럴 디스패치를 사용하여 작업을 지연시키는 데 사용할 수있었습니다 .
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
그러나 이것은 더 이상 스위프트 3 이후로 컴파일되지 않는 것 같습니다. 현대 스위프트에서 이것을 작성하는 선호되는 방법은 무엇입니까?
구문은 다음과 같습니다.
// 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
내부를 수동으로 확인하지 않는 한 블록 실행이 완료됩니다 .
스위프트 4 :
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
// Code
}
시간을 위해 .seconds(Int)
, .microseconds(Int)
그리고 .nanoseconds(Int)
또한 사용될 수있다.
지연 기능을 원한다면
스위프트 4 & 5
func delay(interval: TimeInterval, closure: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + interval) {
closure()
}
}
다음과 같이 사용할 수 있습니다.
delay(interval: 1) {
print("Hi!")
}
Swift 3 릴리스 후 @escaping도 추가해야합니다.
func delay(_ delay: Double, closure: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
closure()
}
}
허용되는 답변의 약간 다른 맛.
스위프트 4
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 + .milliseconds(500) +
.microseconds(500) + .nanoseconds(1000)) {
print("Delayed by 0.1 second + 500 milliseconds + 500 microseconds +
1000 nanoseconds)")
}
스위프트 4
DispatchQueue에서 확장을 작성하고 DispatchQueue
내부적으로 asyncAfter 함수 를 사용하는 함수 지연을 추가 할 수 있습니다.
extension DispatchQueue {
static func delay(_ delay: DispatchTimeInterval, closure: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: closure)
}
}
사용
DispatchQueue.delay(.milliseconds(10)) {
print("task to be done")
}
요구 DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)
Xcode 도구를 사용하여 Swift 3으로 변환하는 것이 좋습니다 (편집> 변환> 현재 Swift 구문으로). 그것은 나를 위해 이것을 잡았다
Swift 4.1 및 Xcode 9.4.1에서
간단한 대답은 ...
//To call function after 5 seconds time
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
//Here call your function
}
메인 스레드가 아닌 스레드에서 실행되는 언급이 없으므로 2 센트를 추가하십시오.
온 메인 큐 (주 스레드)
let mainQueue = DispatchQueue.main
let deadline = DispatchTime.now() + .seconds(10)
mainQueue.asyncAfter(deadline: deadline) {
// ...
}
또는
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(10)) {
// ...
}
에 글로벌 큐 (QOS를 기반으로 논 메인 스레드는, 지정).
let backgroundQueue = DispatchQueue.global()
let deadline = DispatchTime.now() + .milliseconds(100)
backgroundQueue.asyncAfter(deadline: deadline, qos: .background) {
// ...
}
또는
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + .milliseconds(100), qos: .background) {
// ...
}
스위프트 5 이상
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
// code to execute
})
이것은 스위프트 3에서 나를 위해 일했습니다.
let time1 = 8.23
let time2 = 3.42
// Delay 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
print("Sum of times: \(time1 + time2)")
}
당신이 사용할 수있는
DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(100)) {
// Code
}
이 시도
let when = DispatchTime.now() + 1.5
DispatchQueue.main.asyncAfter(deadline: when) {
//some code
}
참고 URL : https://stackoverflow.com/questions/37801436/how-do-i-write-dispatch-after-gcd-in-swift-3-4-and-5
도와주세요.
'development' 카테고리의 다른 글
PHP에서 파일 확장자를 얻는 방법? (0) | 2020.02.18 |
---|---|
Java에서 문자열 반전 (0) | 2020.02.18 |
Visual Studio Code와 Visual Studio의 차이점은 무엇입니까? (0) | 2020.02.18 |
텍스트 영역에서 jQuery 커서 위치 설정 (0) | 2020.02.18 |
C #에서 다차원 배열과 배열 배열의 차이점은 무엇입니까? (0) | 2020.02.18 |