Ich möchte nur einen Übergang ausführen, wenn ich eine bestimmte Antwort vom Server bekomme. Wie schnell kann ich warten, bis ich eine Antwort bekomme?In swift, wie kann ich warten, bis eine Serverantwort eingegangen ist, bevor ich fortfahre?
Antwort
Unterm Strich warten Sie nicht auf die Antwort, sondern geben einfach an, was bei der Antwort geschehen soll. Wenn Sie zum Beispiel einen Übergang durchführen möchten, nachdem eine Netzwerkanforderung ausgeführt wurde, Sie sollten das Beendigungshandlermuster verwenden.
Das Problem hier ist, dass Sie wahrscheinlich daran gewöhnt sind, Ihre UI-Steuerung nur an ein Segment im Interface Builder anzuhängen. In unserem Fall wollen wir das nicht machen, sondern wir wollen die Netzwerkanforderung ausführen und dann den Programmablauf von seinem Abschluss-Handler aufrufen lassen. Wir müssen also ein Segment erstellen, das programmgesteuert ausgeführt werden kann, und dann Ihre Schaltfläche an eine @IBAction
anhängen, die die Netzwerkanforderung ausführt und, falls zutreffend, das Segment programmgesteuert ausführt. Aber, beachten Sie, es sollte keine Verbindung direkt mit dem Button verbunden sein. Wir machen das programmatisch.
Zum Beispiel:
die segue definieren zwischen den beiden Controllern Ansicht von Steuer -dragging aus dem View-Controller-Symbol in der Leiste über der ersten Szene zu der zweiten Szene sein:
können, dass der Übergang von der Auswahl und gehen auf die „Attribute Inspector“ Tab ein Storyboard-Kennung segue:
die Schaltfläche Schalt (oder was auch immer wird diesen Übergang triggern) zu einem
@IBAction
.eine
@IBAction
schreiben, die Netzwerkanforderung und nach Abschluß durchführt, ruft diese programmatisch segue:@IBAction func didTapButton(sender: AnyObject) { let request = NSURLRequest(...) // prepare request however your app requires let waitingView = showWaitingView() // present something so that the user knows some network request is in progress // perform network request let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in // regardless of how we exit this, now that request is done, let's // make sure to remove visual indication that network request was underway defer { dispatch_async(dispatch_get_main_queue()) { waitingView.removeFromSuperview() } } // make sure there wasn't an error; you'll undoubtedly have additional // criteria to apply here, but this is a start guard data != nil && error == nil else { print(error) return } // parse and process the response however is appropriate in your case, e.g., if JSON: // // guard let responseObject = try? NSJSONSerialization.JSONObjectWithData(data!, options: []) else { // // handle parsing error here // return // } // // // do whatever you want with the parsed JSON here // do something with response dispatch_async(dispatch_get_main_queue()) { self.performSegueWithIdentifier("SegueToSceneTwo", sender: self) } } task.resume() } /// Show some view so user knows network request is underway /// /// You can do whatever you want here, but I'll blur the view and add `UIActivityIndicatorView`. private func showWaitingView() -> UIView { let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .Dark)) effectView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(effectView) NSLayoutConstraint.activateConstraints([ effectView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor), effectView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor), effectView.topAnchor.constraintEqualToAnchor(view.topAnchor), effectView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor) ]) let spinner = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge) effectView.addSubview(spinner) spinner.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activateConstraints([ spinner.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor), spinner.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor) ]) spinner.startAnimating() return effectView }
Die Screenshots und der Code sind gut, aber sie scheinen nichts mit 'NSURLSession' zu tun zu haben. –
@ TomHarrington Schritt 4 ist die Durchführung der 'NSURLSessionTask'. In den Schritten 1-3 werden die Schritte beschrieben, die Sie zum programmatischen Ausführen des Programmschritts in Schritt 4 ausführen müssen. Wenn ich die Frage richtig verstanden habe, fragte das OP, wie auf die Netzwerkantwort gewartet werden soll, bevor das Segment ausgeführt wird. – Rob
OK, ich glaube, ich habe mich in dem ganzen Gerede darüber verloren, wie man ein Segment aufstellt. –
- 1. Swift - Warte auf die Antwort "dataTaskWithRequest" bevor ich fortfahre
- 2. Wie kann ich meine Methode warten, bis eine Datei existiert, bevor Sie fortfahren
- 3. Wie warte ich auf den Faden, bevor ich fortfahre?
- 4. Warten bis Boolean in Swift True ist?
- 5. Wie kann ich eine WPF-Storyboard-Animation für eine Sekunde halten, bevor ich fortfahre?
- 6. Warum muss ich erwarten, dass eine Methode asynchron ausgeführt wird. Was, wenn ich nicht warten möchte, bis die Methode beendet ist, bevor ich fortfahre?
- 7. Wie lasse ich jQuery warten, bis ein Ajax-Aufruf beendet ist, bevor er zurückkehrt?
- 8. Warten, bis ein Thread beendet ist, bevor fortgefahren wird
- 9. Kivy warten, bis die Animation beendet ist, bevor Sie fortfahren
- 10. Wie kann ich warten, bis asynchrone Rückrufe beendet sind, bevor die abgerufenen Daten verwendet werden?
- 11. Wie warten, bis ein Animator fertig ist?
- 12. Wie kann ich eine Funktion warten lassen, bis eine Animation abgeschlossen ist?
- 13. Swift warten, bis der bestehende asynchrone Vorgang abgeschlossen ist, bevor ein neuer gestartet wird
- 14. Warten Sie, bis jQuery show() fertig ist, bevor die Funktion fortgesetzt wird?
- 15. Wie warte ich, bis eine HTTP-Anfrage beendet ist, bevor ich weitermache?
- 16. Warten bis eine zeitraubende Funktion beendet ist.
- 17. Wie warten, bis ein ThreadPoolExecutor fertig ist
- 18. Wie kann ich warten, bis ein asynchron erstelltes Objekt vollständig verfügbar ist, bevor ein Rückruf aufgerufen wird?
- 19. C# So warten Sie, bis eine Webseite geladen wird, bevor Sie fortfahren
- 20. Wie kann ich einen neuen Prozess starten und warten bis er fertig ist?
- 21. Warten Sie, bis die SQL-Anweisung wahr ist, bevor Sie fortfahren - Ansbible
- 22. Wie warten, bis die asynchrone Methode abgeschlossen ist?
- 23. Warten Sie, bis eine Anfrage erfolgreich ist \ fail, bevor Sie die nächste Anfrage starten (eine Anforderungswarteschlange)
- 24. Wie kann ich blockieren, bis Dojo Deferred aufgelöst wird?
- 25. Warten bis Tomcat fertig ist
- 26. Ich warte darauf, dass ImageView.animate() beendet wird, bevor ich mit dem Rest des Codes fortfahre
- 27. Wie kann ich die Serverantwort von einer HTTP GET-Anfrage in Swift sehen?
- 28. Wie kann man warten, bis eine neue URL in Nightwatch geladen wird?
- 29. Warten, bis System.Diagnostics.Process.Start fertig ist
- 30. Wie lange sollte ich warten, nachdem ich eine AWS IAM-Richtlinie angewendet habe, bevor sie gültig ist?
Verwendung completionHandler: – Khundragpan
http://stackoverflow.com/questions/ 8427836/how-to-make-program-warten-für-asynchrone-nsurlconnection-to-finish-vor-proce –
Sie wollen fast nie * warten * aktiv sein, da das Ihren aktuellen Thread blockiert. – luk2302