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?#>)
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?#>)
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()))
}
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")
}
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")
}
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)
}
after(3) {
// wird auf der Warteschlange des Aufrufers ausgeführt
print(Date())
}
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.