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?#>)
Apple hat ein dispatch_after snippet für Objective-C:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
<#code to be executed after a specified delay#>
});
Hier ist das gleiche snippet für Swift 3:
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + <#delayInSeconds#>) {
<#code to be executed after a specified delay#>
}
Ein anderer Weg ist es, Double auf diese Weise zu erweitern:
extension Double {
var dispatchTime: dispatch_time_t {
get {
return dispatch_time(DISPATCH_TIME_NOW,Int64(self * Double(NSEC_PER_SEC)))
}
}
}
Dann können Sie es so verwenden:
dispatch_after(Double(2.0).dispatchTime, dispatch_get_main_queue(), { () -> Void in
self.dismissViewControllerAnimated(true, completion: nil)
})
Ich mag Matts Verzögerungsfunktion, aber nur aus Präferenz würde ich lieber das Herumgeben von Closures begrenzen.
In Swift 3.0
Dispatch-Warteschlangen
DispatchQueue(label: "test").async {
//Lang laufende Hintergrundaufgabe
for obj in 0...1000 {
print("asynchron \(obj)")
}
// UI-Aktualisierung in Hauptwarteschlange
DispatchQueue.main.async(execute: {
print("UI-Aktualisierung in Hauptwarteschlange")
})
}
DispatchQueue(label: "m").sync {
//Lang laufende Hintergrundaufgabe
for obj in 0...1000 {
print("synchron \(obj)")
}
// UI-Aktualisierung in Hauptwarteschlange
DispatchQueue.main.sync(execute: {
print("UI-Aktualisierung in Hauptwarteschlange")
})
}
Nach 5 Sekunden verschieben
DispatchQueue.main.after(when: DispatchTime.now() + 5) {
print("Verschiebung nach 5 Sekunden")
}
Swift 3.0-Version
Nachfolgende Closure-Funktion führt einige Aufgaben nach einer Verzögerung 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")
}
1) Fügen Sie diese Methode als Teil der UIViewController-Erweiterung hinzu.
extension UIViewController{
func runAfterDelay(delay: NSTimeInterval, block: dispatch_block_t) {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
dispatch_after(time, dispatch_get_main_queue(), block)
}
}
Rufen Sie diese Methode auf VC auf:
self.runAfterDelay(5.0, block: {
//Fügen Sie hier den Code zu diesem Block hinzu
print("Erfolg nach Verzögerung ausführen")
})
2)
performSelector("IhrMethodenname", withObject: nil, afterDelay: 1)
3)
override func viewWillAppear(animated: Bool) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2), dispatch_get_main_queue(), { () -> () in
//Code Hier
})
//Kompakte Form
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2), dispatch_get_main_queue()) {
//Code hier
}
}
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.