585 Stimmen

Dispatch_after - GCD in Swift? dispatch_after - GCD in Swift?

Ich habe das iBook von Apple durchgesehen und konnte keine Definition davon finden:

Kann jemand die Struktur von dispatch_after erklären?

dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)

1voto

Maxim Makhun Punkte 2197

Hier ist die synchrone Version von asyncAfter in Swift:

let deadline = DispatchTime.now() + .seconds(3)
let semaphore = DispatchSemaphore.init(value: 0)
DispatchQueue.global().asyncAfter(deadline: deadline) {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global()))
    semaphore.signal()
}

semaphore.wait()

Zusammen mit der asynchronen Version:

let deadline = DispatchTime.now() + .seconds(3)
DispatchQueue.main.asyncAfter(deadline: deadline) {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global()))
}

0voto

Vlady Veselinov Punkte 3609

Swift 4 hat eine ziemlich kurze Möglichkeit, dies zu tun:

Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { (timer) in
    // Dein Code hier
    print("hallo")
}

0voto

Tim Punkte 1410

Jetzt mehr als nur Zuckerguss für asynchrone Dispatches in Grand Central Dispatch (GCD) in Swift.

Fügen Sie Podfile hinzu

pod 'AsyncSwift'

Dann kannst du es so verwenden.

let seconds = 3.0
Async.main(after: seconds) {
print("Wird nach 3 Sekunden aufgerufen")
}.background(after: 6.0) {
print("Mindestens 3,0 Sekunden nach dem vorherigen Block und 6,0 Sekunden nachdem der Async-Code aufgerufen wurde")
}

0voto

Himanshu Mahajan Punkte 4603

Verwenden Sie diesen Code, um nach 2,0 Sekunden eine bestimmte UI-Aufgabe auszuführen.

            let verzögerung = 2.0
            let verzögerungInNanoSekunden = dispatch_time(DISPATCH_TIME_NOW, Int64(verzögerung * Double(NSEC_PER_SEC)))
            let hauptWarteschlange = dispatch_get_main_queue()

            dispatch_after(verzögerungInNanoSekunden, hauptWarteschlange, {

                print("Einige UI-bezogene Aufgaben nach Verzögerung")
            })

Swift 3.0 Version

Die folgende Closure-Funktion führt nach einer Verzögerung eine Aufgabe im Hauptthread aus.

func performAfterDelay(delay : Double, onCompletion: @escaping() -> Void){

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay, execute: {
       onCompletion()
    })
}

Rufen Sie diese Funktion wie folgt auf:

performAfterDelay(delay: 4.0) {
  print("Test")
}

0voto

Mojtaba Hosseini Punkte 68078

Erhaltung der aktuellen Warteschlange!

Neben guten Antworten auf diese Frage sollten Sie auch in Betracht ziehen, die aktuelle Warteschlange zu erhalten, um unnötige Hauptwarteschlangenoperationen zu vermeiden (zum Beispiel, wenn Sie versuchen, einige asynchrone Operationen zu verzögern).

func after(_ delay: TimeInterval,
           perform block: @escaping ()->(),
           on queue: DispatchQueue = OperationQueue.current?.underlyingQueue ?? .main) { // Damit `queue` die aktuelle Warteschlange erhält und standardmäßig auf die `main` gesetzt wird. Der Aufrufer kann auch explizit die gewünschte Warteschlange übergeben
    queue.asyncAfter(deadline: .now() + delay, execute: block)
}

Verwendung:

after(3) {
    // wird auf der Warteschlange des Aufrufers ausgeführt
    print(Date())
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X