2016-04-04 25 views
0

Ich habe gesucht und habe nicht gefunden, jemand, der etwas wie diese aber wenn ja, bitte zögern Sie nicht, weisen Sie mich in die richtige Richtung!Füllen UITableview mit Instanz zu füllen Array

So MVC, ich habe eine Instanz in meinem erstellt UITableviewcontroller

var brainLink = LessonBrain() 

Das ist mein viewDidLoad die Daten abrufen soll und das Array 'subjectNameOneDay' bevölkern:

let todoDictionary = NSUserDefaults.standardUserDefaults().dictionaryForKey("subjectDictionary") ?? [:] 

    brainLink.parseQuery(self.setupData.integerForKey("pupilNumber"), dictName: "subjectDictionary") 

    self.subjectNameOneDay = todoDictionary["TwoTuesday"]! as! NSArray 

self.tableView.reloadData()

Die Instanz brainLink ruft die Methode 'parseQuery' auf:

func parseQuery(numberToRetreive: Int, dictName:String) { 
     var tempArray:[String] = [] 


     if self.daysOfTheWeek.contains("\(self.currentDayOfTheWeekForLabel)") { 

      print(currentDayOfTheWeekForLabel) 


      print("parse query for data number \(numberToRetreive) started") 

      let query:PFQuery = PFQuery(className: self.setupData.valueForKey("organisationID") as! String) 
      query.fromLocalDatastore() 
      query.whereKey("PupilNumber", equalTo: "\(numberToRetreive)") 
      query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 

       if (error == nil) { 

        print("Successfully retrieved 2 \(objects)") 

        for object in objects! { 

         var periodCounter = 1 

         while periodCounter <= 6 { 

          print(self.currentDayOfTheWeekForData) 


          tempArray.append(object.valueForKey("\(self.currentDayOfTheWeekForData)P\(periodCounter)") as! String) 
          print(tempArray) 

          periodCounter += 1 

         } 

         self.addItem(tempArray, weekDayPeriod: self.currentDayOfTheWeekForData, dictionaryName: dictName) 

        } 
       }else { 
        print(error!.userInfo) 
       } 
      } 
     }else{ 
      print("It's the weekend!") 
     } 
     print("query function returning temp array") 

    } 

Das alles funktioniert gut und das Array wird jedoch das Problem, das ich habe, ist, dass egal, was ich versucht habe, oder wo ich lege meine self.tableView.reloadData() Es muss nicht immer ‚warten‘ für die Daten, bevor Sie versuchen geholt werden neu geladen werden Der Tisch.

Wo kann ich diesen Code/ordnen, so dass es Daten holt DANN lädt?

+0

Fügen Sie die reloadData zu Ihrem Rückruf hinzu, nicht die Ansicht geladen wurde. Zu diesem Zeitpunkt werden die neuen Daten abgerufen. – MDB983

+0

Entschuldigung für meine Ignoranz ..... wie würde ich es zu meinem Rückruf hinzufügen? meinst du, return self.tableView.ReloadData() aus der parseQuery-Funktion ?? – MartynE23

+0

ja, aber Sie brauchen eine Adresse als Referenz so _weak MyTableViewClass * MyClass = self. Dann in Pars-Abfrage-Funktion mylass.reloadData (Sie sollten überprüfen, meine Klasse wurde nicht vor dem Aufruf der Methode nil'd out). Sie müssen sicherstellen, dass die Datenquelle tableview auch vor dem Aufruf von my class.reloadData gefüllt ist. – MDB983

Antwort

0

die obige Zeile:

query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in

startet einen Abschluss-Handler. Dieser Block wird immer dann ausgeführt, wenn der Aufruf abgeschlossen ist. Daher wird der Ausführungs-Thread weiterhin ausgeführt. Wenn Ihr Aufruf reloadData ausgeführt wird, hat er die Objekte noch nicht zu Ihrem Array hinzugefügt.

Wenn Sie Ihre reloadData Anruf als das letzte, was in diesem Block passiert, setzen, werden Sie näher an die gewünschten Ergebnisse erhalten.

Sie sollten auch sicherstellen, dass Sie auf dem Hauptthread ausgeführt werden, obwohl Sie UI-Aufrufe ausführen. Da Ihr Completion-Block in jedem Thread ausgeführt werden könnte, könnten Sie Folgendes tun:

  dispatch_async(dispatch_get_main_queue(), { 
       self.tableView.reloadData() 
      }) 
+0

Danke Mathew ....... das Reload in die letzte Zeile des Blocks zu setzen, gibt mir einen Fehler ..... die Methode befindet sich in einer anderen Klasse, die keine UITableViewController-Unterklasse ist und daher nicht geladen werden kann. Wo würde der obige Code platziert werden? – MartynE23

+0

Sie könnten den obigen Reload-Aufruf durch einen Funktionsaufruf für Ihre Klasse ersetzen, in dem Sie den Reload auf Ihrem Tisch aufrufen können. –