2016-04-09 7 views
-1

Ich versuche, einige Daten aus dem Back-End zu holen und sie dann 3 verschiedenen Arrays zuzuweisen. Diese Arrays möchte ich dann verwenden, um meine TableViewCells zu füllen. Das Problem ist, wenn ich meine Arrays außerhalb des Abrufblocks drucke, geben sie null zurück. Wenn ich sie im Abrufblock drucke, geben sie die Variablen des Objekts zurück, die ich dazu bestimmt habe.Wie fülle ich diese Arrays, um dann ein TableView aufzufüllen?

Ich schließe die self.tableView.ReloadData() Zeile in der Hoffnung, dass die Arrays gefüllt werden und anschließend füllen die TableViewCells, aber es scheint nicht zu funktionieren.

Irgendwelche Vorschläge, wie diese Arrays korrekt gefüllt werden können. Wenn ich sie also außerhalb der Abrufanforderung drucke, geben sie die entsprechenden Daten zurück.

var capArray = [String]() 
var imageDic = [String: [PFFile]]() 
var priceArray = [Int]() 


override func viewDidAppear(animated: Bool) { 

    capArray.removeAll(keepCapacity: true) 
    imageDic.removeAll(keepCapacity: true) 
    priceArray.removeAll(keepCapacity: true) 

    let query = PFQuery(className: "SellerObject") 
    query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 

     if let objects = objects { 
      for o in objects { 

       if o.objectForKey("caption") != nil && o.objectForKey("imageFile") != nil && o.objectForKey("price") != nil { 
       let cap = o.objectForKey("caption") as? String 
        self.capArray.append(cap!) 
       let imdic = o.objectForKey("imageFile") as? [PFFile] 
       self.imageDic[cap!] = imdic 
       let price = o.objectForKey("price") as? String 
       let priceInt = Int(price!) 
       self.priceArray.append(priceInt!) 

      } 
      } 
     } 
    } 

    self.tableView.reloadData()  
} 

Antwort

0

Ihr Problem ist, dass self.tableView.ReloadData() ausgeführt wird, bevor der Block die Ausführung beendet hat.

Die einfachste Sache zu sehen, es funktioniert, ist es, Self.tableView.ReloadData() innerhalb des Blocks zu verschieben, aber das ist ein Kurzzeit-Hack nur um Dinge in Aktion zu sehen.

Aber das ist nicht der richtige langfristige Ansatz. Um dies richtig durchzuführen, sollte Ihr Array-Populationscode wirklich in einem Modell sein. Ihre Tabellenansicht würde zunächst ohne zu verwendende Daten geladen. Ihr Modell würde Ihren View-Controller benachrichtigen, sobald Daten verfügbar sind, und der Ansichts-Controller aktualisiert dann die Tabelle.

Wenn die Daten vom Gerät kommen, könnte die Tabellenansicht warten, bevor sie geladen wird, wenn die Daten schnell abgerufen werden können. Wenn die Daten über ein Netzwerk übertragen werden, muss sie warten.

+0

OK, das macht Sinn. Aber jetzt, wenn ich die self.tableView.ReloadData() hinzufüge, stürzt die App mit der folgenden Fehlermeldung ab: fataler Fehler: Unerwartetes gefunden, Null beim Entpacken eines Optionalen Werts –

+0

Sie müssen herausfinden, woher das kommt. Es gibt buchstäblich Tausende von Fragen in der Vergangenheit mit genau dem Satz "unerwartet gefunden Null beim Auspacken eines optionalen Wertes" im Titel oder in der Frage. – Gruntcakes

+1

Überprüfen Sie diesen Thread: http://stackoverflow.com/questions/35683813/how-to-deal-with-fatal-error-unexpectedly-found-nil-while-unwrapping-an-option –

Verwandte Themen