Ich werde nicht in der Lage sein, um einen Wert zurückzugeben, mit Alamofire in Swift
Den aktuellen code ein, ich habe doens ' T scheinen, etwas zurückzugeben, ich kann nicht herausfinden, was das Problem verursacht.
func getQuests(category: NSString, count: Int) -> NSArray {
var quests = NSArray()
Alamofire.request(.GET, apiUrlString, parameters: ["category": category, "count": count])
.responseJSON { (request, response, json, error) in
dispatch_async(dispatch_get_main_queue(), {
quests = json as NSArray
})
}
println(quests) #=> ()
return quests
}
Weiß jemand, wie das Problem zu lösen bin ich?
[Update]: Dies ist der status.
Schauen Sie bitte auf der fünften und acht Zeilen.
Ich kann den Auftrag nicht bekommt, um quests zu arbeiten.
var quests = NSArray()
getQuests("normal", count: 30, completionHandler: {
quests in
self.quests = quests
})
println(self.quests) #=> ()
func getQuests(category: NSString, count: Int, completionHandler: (NSArray -> Void)) {
var quests = NSArray()
Alamofire.request(.GET, apiUrlString, parameters: ["category": category, "count": count])
.responseJSON { (request, response, json, error) in
dispatch_async(dispatch_get_main_queue(), {
quests = json as NSArray
completionHandler(quests)
})
}
}
Dank.
- Alamofire ist asynchron, wenn Sie drucken
quests
Sie noch nicht Ihre responseJSON. - mögliche Duplikate von Wörterbuch ist nicht konvertierbar Void
- Ja, dies ist eine doppelte, aber die Frage tatsächlich besser beschreibt, das problem bei der hand 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die anderen Antworten sind sicher richtig und trifft auf viele der Probleme, die Sie mit asynchronen Operationen. Ich würde nur gerne die Tatsache hinzufügen, dass die
dispatch_async(dispatch_get_main_queue())
Anruf ist nicht erforderlich.Dies ist bereits erfolgt automatisch innerhalb von Alamofire. Alamofire behandelt alle Vorgänge, die auf eine interne Stellvertretung-Versand-Warteschlange. Nachdem diese Vorgänge abgeschlossen sind (Validierung, Antwort Serialisierung, etc.), Ihr Abschluss-handler-Verschluss am main dispatch queue standardmäßig. Dies macht die
dispatch_async
unnötig und sollte entfernt werden.Hier ist eine Kurzfassung der gleichen Logik.
Wenn dabei die asynchrone Arbeit in einer Funktion, es ist nicht möglich, den Rückgabewert, wie Sie möchte.
Funktionen, die asynchrone Teile in Ihr in der Regel können Sie in einem "Abschluss-handler", die ausgeführt wird, nachdem die asynchrone Aufgabe abgeschlossen ist.
In Ihrem Fall würde dies bedeuten, müssen Sie ändern Ihre Funktion "getQuests" wie diese zum Beispiel:
Dann können Sie diese Funktion aufrufen, von irgendwo und gehen in die Fertigstellung handler, wo Sie etwas zu tun mit den quests abgerufen:
Hoffe, dies wird Ihnen den Einstieg.
Müssen Sie quests, die eine Eigenschaft der Klasse, so dass Sie zugreifen können, die innerhalb der asynchronen callback.
Sind Sie nicht gehen, um in der Lage sein, um zurückzukehren das array, denn es ist async. Entfernen Sie einfach die return-Typ. Wenn der Rückruf feuert, speichern Sie die Ergebnisse auf dem array, und tun, was immer Sie möchten, zu geschehen.