UITableView endUpdates nimmt sehr lange Zeit in Anspruch, wenn CoreData aktualisiert wird

8

Ich habe eine Core Data App, die eine große Anzahl von Instanzen in UITableView anzeigt.

Wir haben eine mainQueueContext im Hauptthread und eine privateQueueContext in einem Hintergrundthread.

Wir laden die Daten in UITableView ohne Probleme, aber wenn wir eine aktualisierte Version von der API laden, speichern wir sie in privateQueueContext und verschmelzen sie in mainQueueContext

%Vor%

Es dauert ein paar Sekunden, um den Anruf zu

auszulösen %Vor%

Was löst den Aufruf aus:

%Vor%

Dann hängt die App und die CPU geht zu 100% und der Speicher beginnt unendlich zu steigen, bis der Speicher aufgebraucht ist. (siehe Bild unten)

Bei weniger als 1000 Elementen tritt dieses Problem nicht auf. Ich habe mich gefragt, ob jemand von euch so etwas gesehen hat.

Bearbeiten

Hier sind einige Daten von Instrumenten

    
ppaulojr 27.04.2016, 21:06
quelle

3 Antworten

1

Eine Verbesserung, die Sie tun können, ist fetchBatchSize .

Von Apple Doc "

  

Wenn der Abruf ausgeführt wird, wird die gesamte Anfrage ausgewertet und die   Identitäten aller übereinstimmenden Objekte aufgezeichnet, aber nicht mehr als   Die Daten von batchSize-Objekten werden aus dem persistenten Speicher bei a abgerufen   Zeit. Das von der Ausführung der Anfrage zurückgegebene Array ist ein Proxy   Objekt, das Chargen auf Anforderung transparent ausfüllt. (In der Datenbank   Dies ist ein In-Memory-Cursor.)

Sie können auch fetchLimit und fetchOffset verwenden, um die Paginierung zu implementieren.

Prost, Alessandro

    
ubiAle 27.05.2016 01:44
quelle
1

Ich habe dieses Problem auch erlebt. Am Ende sammelte ich alle updated in Array auf% Co_de% Aufnahme Index Pfad, NSFetchedResultsChangeType und Objekt selbst. On controller: didChangeObject: Ich habe gesucht, ob die Anzahl größer als X ist, wenn es dann nur ganze Tabelle neu laden (es ist viel effizienter) und wenn es nicht dann alle Änderungen normal anwenden, als ob es in controllerDidChangeContent: Methode passiert. Es macht einfach keinen Sinn, so viele Zellen einzufügen / löschen / zu verschieben, da der Benutzer die meisten dieser Änderungen sowieso nicht sehen wird.

Ich hoffe, dieser Ansatz wird Ihnen helfen!

    
wirrwarr 04.08.2016 10:35
quelle
1

Ich hatte ein ähnliches Problem. In meinem Fall bestand die Lösung darin, die Einstellung explizit rowHeight der tableView auf UITableViewAutomaticDimension :

zu entfernen %Vor%

Ich habe stattdessen den Delegierten tableView(_:heightForRowAt:) verwendet Obwohl die Dokumentation von rowHeight das Gegenteil zu sagen scheint:

  

Es gibt Leistungseinbußen bei der Verwendung von tableView (: heightForRowAt :) anstelle von rowHeight. Jedes Mal, wenn eine Tabellenansicht angezeigt wird, ruft sie tabletView (: heightForRowAt :) auf dem Delegaten für jede Zeile auf, was zu einem erheblichen Leistungsproblem bei Tabellenansichten mit einer großen Anzahl von Zeilen (ungefähr 1000 oder mehr).

    
Lorex 30.11.2016 01:19
quelle