Unbeabsichtigtes Neuladen / Aktualisieren der Tabelle mit einiger Verzögerung

Xcode 6 - Beta 6/7: Ich habe eine iOS 8 (Swift) -Blog-Reader-App mit einem Übersichtsbildschirm (Tabellenansicht) und einem Detailbildschirm (Webansicht) erstellt. Wenn eine Internetverbindung besteht, lädt die App beim Start die tatsächlichen JSON-Daten aus dem Blog und speichert sie als Entitätsobjekte in den Kerndaten. Die zuerst angezeigte Tabellenansicht füllt dann ihre Zellen mit diesen Objekten aus den Kerndaten. Die Zellen, die Titel und Untertitel enthalten, werden wie erwartet vollständig geladen. Alles scheint gut zu funktionieren, aber ...

Wenn ich nicht interagiere und nur warte, wird die Tabellenansicht nach etwa 10 Sekunden schnell aktualisiert (Zellen werden leer und werden innerhalb einer halben Sekunde wieder mit demselben Text gefüllt). Danach funktioniert alles einwandfrei. Ich kann auf die benannten Zellen klicken und werde zur Detailansicht weitergeleitet. Ich kann zurückgehen und eine andere auswählen.

Wenn ich wie gewohnt sofort mit der Interaktion beginne, muss ich zweimal auf eine Zelle klicken, bevor ich zur Detailansicht weitergeleitet werde. Wenn ich innerhalb kurzer Zeit zur Übersicht zurückkehre, finde ich meine Tabellenansicht nur mit der einen Zelle gefüllt, auf die ich gerade zuvor getippt habe, der Rest sind Leerzeichen.

Entweder kann ich dann noch 5-15 Sekunden warten, bis alles automatisch aktualisiert wird (und ab diesem Zeitpunkt funktioniert alles einwandfrei) oderIch kann auf die leeren Zellen tippen, die dann sofort wieder sichtbar werden, wobei ich natürlich wieder in die Detailansicht weitergeleitet werde oder

Wenn ich länger in der Detailansicht gestanden habe, lassen Sie uns einen Teil des Blogs lesen und dann zurückgehen, sind alle Zellen sichtbar, da in der Zwischenzeit genügend Zeit für diese seltsame Aktualisierung vorhanden war.

Als Hinweis: Wenn keine Internetverbindung besteht, lädt die App die Objekte erfolgreich aus den Kerndaten, das erwähnte Problem bleibt jedoch bestehen. Ich muss also auf jeden Fall warten, bis diese "zweite Aktualisierung" stattgefunden hat, bevor die App so läuft, wie ich es auch will.

Wenn es sich um ein völlig unbekanntes Problem handelt und Sie einen Teil des Codes zur weiteren Untersuchung benötigen, teile ich ihn gerne mit. Aber im Moment habe ich keinen Punkt gesehen, da es mehr oder weniger der grundlegende Code ist, der bei der Verwendung von Tabellenansichten implementiert wird. Ich bin ziemlich neu im Umgang mit Kerndaten und habe vielleicht etwas übersehen, aber es ist mir bisher nicht aufgefallen. Für Hilfe wäre ich sehr dankbar, da ich normalerweise ziemlich lange nachforsche, bevor ich frage, aber diesmal habe ich wirklich keine Ahnung, woran das liegen könnte.

BEARBEITEN

Es kann wichtig sein, hinzuzufügen, dass ich die App mit der Vorlage "Master-Detail-Anwendung" in Xcode gestartet habe und uns die Methoden aneignen, mit denen die Zellen automatisch mit den richtigen Entitätsobjekten aus Kerndaten (NSFetchedResultsController) gefüllt werden. Ein Teil des Codes, der einen Hinweis darauf geben könnte, wo weitere Nachforschungen angestellt werden sollen (bitte sagen Sie mir, wenn mehr Code benötigt wird):

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
    self.configureCell(cell, atIndexPath: indexPath)
    return cell 
}    

func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) {
    let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
    cell.textLabel?.text = object.valueForKey("title")?.description
    let published = object.valueForKey("published")?.description
    let author = object.valueForKey("author")?.description
    let spaceholder = "   "
    cell.detailTextLabel?.text = published! + spaceholder + author!
}

EDIT 2:

Danke an die Eingabe nzeltzer Ich denke, ich habe den Punkt gefunden: Das Problem oben tritt aufgerad, wenn einige Teile des Codes auf einem globalen Thread (anstelle des Hauptthreads) ausgeführt werden. Also habe ich ein paar Tests durchgeführt: Die Konsolenausgabe unten zeigt die Ergebnisse von NSThread.isMainThread (), wenn die App für das @ erstellerstes Ma.

Wenn ich die App erneut starte azweites Ma und mehr, der Prozess ist der folgende: Kerndaten haben bereits einige Werte, so dass die Zellen direkt konfiguriert werden (Protokoll:_ is Main Thread). Wenn dann eine Internetverbindung besteht, werden alle Kerndatenobjekte gelöscht (in viewDidLoad), die json-Daten erneut geladen, die Objekte in die Kerndaten verschoben und die Zellen ein zweites Mal erstellt. Dieser zweite Teil des Logs ist jetzt wieder_ is NOT Main Thread. Wenn ich die App jetzt ohne Internetverbindung starte, wird der zweite Teil nicht ausgelöst und nur die erste Zellenkonfiguration mit_ is Main Thread stattfinden

Eine einfache Erklärung für dieses Verhalten?

Was wäre der richtige (elegante) Ansatz, um die Teile, die für das Problem verantwortlich sein könnten, auf jeden Fall auf Haupt-Thread zu versenden? Hat dies etwas mit dem integrierten NSFetchedResultsController der Vorlage zu tun oder ist es normal, dass einige Aufgaben automatisch an globale Warteschlangen gesendet werden?

Log (App erstellt für daserstes Ma, 10 Zellen):

2014-09-08 13:04:54.821 Blog Reader[3682:193346] 17545849:_UIScreenEdgePanRecognizerEdgeSettings.edgeRegionSize=13.000000
2014-09-08 13:04:54.823 Blog Reader[3682:193346] 17545849:_UIScreenEdgePanRecognizerEdgeSettings.edgeRegionSize=13.000000
NumbersOfRowsInSection is Main Thread
NumbersOfRowsInSection is Main Thread

NumbersOfRowsInSection is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread
configureCell is NOT Main Thread
cellForRowAtIndexPath is NOT Main Thread

Antworten auf die Frage(2)

Ihre Antwort auf die Frage