Ich habe eine Reihe von View-Controllern (eingebetteter Navigationscontroller), und ich muss einige Async-Aufrufe durchführen, bevor ich zum nächsten Bildschirm übergehe. Das Problem ist, dass ich diesen Aufruf zu der Zeit machen muss, wenn ich auf die Schaltfläche klicke, die dem Segment zugeordnet ist, aber da der Async-Aufruf noch nicht zurückgegeben wurde, wird der Übergang gemacht und der nächste Ansichtscontroller angezeigt. Wie machen Menschen so etwas, um zu verhindern, dass die Navigation in der Ansichts-Steuerung stattfindet, bevor der asynchrone Aufruf zurückgegeben wird?Einen asynchronen Anruf vor einem Übergang zum nächsten View-Controller machen (Swift)
Antwort
TL; DR Sie kann eine @IBAction
für die UIButton
erstellen und innerhalb der Funktion den Async-Aufruf vornehmen und den Abschnitt manuell im completionHandler mit der dispatch_async(dispatch_get_main_queue()) {}
starten.
Und dann werden Sie sehen, welche Art von Segue wählen:
Um Ihre segue manuell nur Ctrl + Drag vom UIViewController
zum nächsten wie im folgenden Bild zu erstellen wie in diesem Bild:
Nachdem Sie den Show
Typ wählen Sie die segue in der Hierarchie der Ansicht in der linken wählen sie die Kennung der Segue wie in diesem Bild setzen sehen:
Sie Ihr Problem der segue
starten umgehen kann manuell mit Mit der Funktion performSegueWithIdentifier
können Sie im Web referenzieren, um viele Anleitungen zum manuellen Erstellen eines Segments mit dem Interface Builder zu erhalten.
Sobald Sie wurde erstellt segue können Sie es überall rufen Sie wollen, in Ihrem Fall, wie Sie es in einem completionHandler eines Asynchron-Aufruf rufen Sie im Hauptthread einfügen müssen, mit der dispatch_async(dispatch_get_main_queue()) {}
Funktion Grand Central Versand.
So etwas wie diesem Code:
@IBAction func buttonTapped(sender: AnyObject) {
asyncFunction() {
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("someID", sender: sender)
}
}
}
bearbeiten: Beachten Sie, dass in Swift 3 die Syntax geändert hat:
@IBAction func buttonTapped(_ sender: AnyObject) {
asyncFunction() {
DispatchQueue.main.async {
self.performSegueWithIdentifier("someID", sender: sender)
}
}
}
Ich hoffe, Sie, das hilft.
Nun, ich habe das Segment in IB erstellt Strg ziehen von der Schaltfläche zum nächsten View-Controller, wie storniere ich die Überleitung Aktion, die Art von "hinter den Kulissen" ist? Wird das nicht immer noch ausgeführt? – u84six
Was meinst du mit Abbrechen der Überfahrt? –
Nun, wenn ich nur von der Schaltfläche ziehen, um Controller anzuzeigen, wird der Übergang passieren, wenn ich auf die Schaltfläche klicke. Dies passiert nicht in meinem Code. Es ist gegeben, wenn Sie die Verbindung herstellen (die Aktion, die ich ausgewählt habe, ist "Show"). – u84six
Es klingt, als ob Sie es suchen, um synchron zu laufen; also, wenn Sie mit GCD Anruf dispatch_sync
statt dispatch_async
wenn sie auf dem Hintergrund-Thread, die schweres Heben setzen, und wenn Sie benötigen die Segue setzen die Dinge wieder auf den Hauptthread geschehen durch den Aufruf dispatch_sync(dispatch_get_main_queue(), ^{ // handle error or segue }
Kann ich diesen Anruf tätigen und auch einen Wartetimer anzeigen? – u84six
Sie können einen Wartetimer anzeigen, bevor Sie auf einen Hintergrundthread zugreifen und ihn entfernen, sobald sich die Dinge wieder im Hauptthread befinden. – aduflo
@aduflo Was Sie sagten, es ist nicht der empfohlene Weg, das Problem zu lösen, asynchrone Aufrufe wurden hauptsächlich gemacht, um das Einfrieren zu vermeiden der Benutzeroberfläche. –
- 1. C# Machen Sie einen asynchronen HTTP-Anruf
- 2. So stornieren Sie einen asynchronen Anruf?
- 3. Machen Mocha vor dem nächsten Test warten
- 4. Schieb den Übergang von UITableViewCell zu ViewController in Swift
- 5. Führen Sie einen Code vor einem Übergang, nachdem ich eine Taste in swift
- 6. UICollectionView Scrollen/Swipe zum nächsten Element swift
- 7. Android - Machen Sie einen Anruf
- 8. SQL-Schleife zum nächsten und vor Daten
- 9. Übergang zur Registerkarte bei SelectedIndex Von ViewController
- 10. Aufrufmethode von einem anderen ViewController | Swift
- 11. Wie konvertiert man einen asynchronen Anruf in eine Synchronisierung?
- 12. Control vars/IBOutlets von einem ViewController in einem anderen ViewController
- 13. machen einen nahen, relativ Anruf mit NASM
- 14. Wie aus einem anderen Viewcontroller in Swift
- 15. Variablen, die beim Übergang zu einem anderen ViewController zurückgesetzt werden
- 16. Swift: Benutzerdefinierte ViewController-Initialisierer
- 17. Einen API-Aufruf in Swift 2.0 machen
- 18. Wie einen Anruf über die Programmierung machen
- 19. Einen Anruf von der iPhone Anwendung machen
- 20. machen Sie einen GET-Anruf 100.000 mal
- 21. Segue zu einem ViewController von nicht-Storyboard ViewController
- 22. Swift: TableView in ViewController
- 23. Übergang UIButton Bild von einem Bild zum anderen
- 24. Wie verwende ich Tornado, um einen asynchronen Ping zu machen?
- 25. Admob-Anzeige Interstitial vor segue - Swift
- 26. Beobachter erhält nur Wert von einem nächsten Anruf
- 27. Zum nächsten Schlüssel in einem Array
- 28. Zurück zum vorherigen (root) ViewController
- 29. machen Anruf Ionic App
- 30. Lock-Ausrichtung eines ViewController in Swift
Haben Sie einen Code zu zeigen? – iamalizade
Tun Sie es nicht, stattdessen tun Sie es in der neuen Steuerung – Wain
Ich kann es nicht in der nächsten Controller tun, da der nächste View-Controller sollte nur angezeigt werden, wenn die Async-Methode erfolgreich ist. – u84six