Ich habe ein TableView, das ich mit einer Liste von Elementen füllen möchte, die von einem Webdienst bereitgestellt werden. Der Service gibt ein JSON-Objekt mit Status (Erfolg oder Fehler) zurück und zeigt ein Array von Strings an.Wie erhalte ich einen Wert von einer NSURLSession-Aufgabe in eine Instanzvariable?
In viewDidLoad nenne ich die benutzerdefinierte Methode getShowsFromService()
func getShowsFromService() {
// Send user data to server side
let myURL = NSURL(string: "https://myurl.com/srvc/shows.php")
// Create session instance
let session = NSURLSession.sharedSession()
var json:NSDictionary = [:]
// Create the task
let task = session.dataTaskWithURL(myURL!) { //.dataTaskWithRequest(request) {
(data, response, error) in
guard let data = data else {
print("Error: \(error!.code)")
print("\(error!.localizedDescription)")
return
}
do {
json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) as! NSDictionary
} catch {
print (error)
}
let sts = json["status"] as! NSString
print("\(sts)")
}
// Resume the task so it starts
task.resume()
let shows = json["shows"] as! NSArray
for show in shows {
let thisshow = show as! String
showsArray.append(thisshow)
}
// Here I get "fatal error: unexpectedly found nil while unwrapping an Optional value"
}
Das Verfahren empfängt das JSON-Objekt und setzt es in ein Wörterbuch. Dann möchte ich dieses Wörterbuch verwenden, um json ['show'] aufzurufen, um zu dem Array von Shows zu gelangen, die ich in einer Instanzvariable namens saysArray speichern möchte. Die Idee ist, showArray in tableView (cellForRowAtIndexPath) zu verwenden, um die Daten auszufüllen.
Das Problem ist, dass ich das Wörterbuch nicht in die Variable bekommen kann. Wenn ich versuche, es innerhalb der Aufgabe zu tun, erhalte ich einen Fehler, der besagt, dass ich self.showsArray aufrufen muss, und wenn ich das tue, gehen die Daten nicht in das Array. Wenn ich es außerhalb der Aufgabe mache, erhalte ich einen Fehler, weil es sagt, dass ich versuche, einen Nullwert auszupacken.
Wie kann ich das Wörterbuch erstellt innerhalb der Aufgabe in die ShowsArray var?
Danke für die Hilfe Daniel. Ich habe versucht, den Code zu verwenden, aber wenn ich zu, wenn JSON NSJSONSerialization.JSONObjectWithData (Daten, Optionen: NSJSONReadingOptions()) wie erhalten! NSDictionary {Ich bekomme einen Fehler (Initialisierer für bedingte Bindung muss optionalen Typ haben, nicht NSDictionary). – cesarcarlos
Ich habe es tatsächlich geschafft, diesen Teil zu reparieren und es geschafft, die Daten in die Klasseneigenschaft showSArray zu bekommen. Das Problem besteht nun darin, dass cellForRowAtIndexPath die Daten von diesem Array nicht lädt. Vielleicht, weil zum Zeitpunkt der Erstellung des Arrays CellForRowAtIndexPath bereits aufgerufen wurde? – cesarcarlos
Gern geschehen!Ja, Sie können eine Reload-Tabellenmethode aufrufen, wenn Sie die Daten erhalten, so dass die Tabelle die aktualisierten Inhalte anzeigt, sobald dies geschieht. Ich werde die Antwort aktualisieren –