Ich habe eine TableView mit Abschnitten, die geöffnet und geschlossen werden können. Wenn ich also auf einen Abschnitt klicke, um ihn zu öffnen, wird er mit Zellen gefüllt und -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
wird genau so oft aufgerufen wie in -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
.
Stimmt das? Sollte es nicht nur die Anzahl der sichtbaren Zellen sein?
Weil ich in meinem Fall eine schlechte Situation habe: Ich habe viele benutzerdefinierte Zellen (50 ~ 100 Zellen) und den Aufruf von -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
für jede Zelle verlangsamt die Öffnung eines Abschnitts, weil jedes Mal das Lesen von Nib durchgeführt wird und Zellinhalt wird mit Bild gefüllt.
Ich habe die Sichtbarkeit der Zelle in -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
wie folgt überprüft:
und es zeigt, dass von 45 Zellen nur 6 oder 7 sichtbar sind. Andere sind außerhalb des sichtbaren Bereichs. Aber das Erstellen von Zellen wurde noch ausgeführt. Hier ist der Code:
%Vor%Stimmt das immer noch? Oder vermisse ich etwas?
Nun, ich habe mich irgendwie mit meinem Problem beschäftigt. Hier sind meine Ideen und Gedanken, wie ich zu der Lösung gekommen bin. Vielleicht könnte es für jemanden hilfreich sein.
Ich habe Speicherzuweisungen angewiesen und Callstacks mit Instrumenten während des Öffnens von Sektionsereignissen aufgerufen. Es zeigte mir, dass die meiste Zeit damit verbracht wird, Zellen aus der Nib-Datei zu laden.
Zuerst habe ich die Größe der nib-Datei reduziert, dh die Anzahl der Ansichten in einer benutzerdefinierten Tabellenansichtszelle minimiert (jetzt sind es nur noch 2 Ansichten und 2 Beschriftungen statt 6 Ansichten) , 2 Bilder und 2 Etiketten vorher). Es gab mir eine Verbesserung der Zellenladung. Die Apple-Dokumentation schlägt vor, möglichst wenige Ansichten zu verwenden und keine Transparenz zu verwenden. Achte also auf diese Vorschläge.
Zweitens, wie ich zuvor entdeckt habe, dass nicht alle Zellen sichtbar sind, die von -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
erstellt werden, habe ich beschlossen, irgendwie die Anzahl der Ladevorgänge neuer Zellen aus der NIB-Datei zu reduzieren. Um dies zu erreichen, habe ich eine einfache Idee: leere Standardzellen für unsichtbare Zeilen zurückgeben, während benutzerdefinierte Zellen von der Spitze für sichtbare geladen werden. Hier ist das Stück Code:
Wie Sie sehen, verwende ich nicht nur -(NSArray*)indexPathsForVisibleRows
method von tableview zum Erkennen von sichtbaren Zellen. Stattdessen habe ich meine eigene Methode -(NSMutableArray*)getExtendedVisibleIndexPathsForTableView:(UITableView*)tableView
geschrieben. Dies war notwendig, weil bei Verwendung von -(NSArray*)indexPathsForVisibleRows
die Zellen neben der letzten sichtbaren Zelle oder die Zellen vor der ersten sichtbaren Zelle als leere Zellen erstellt wurden und beim Scrollen wie leere Zellen aussahen. Um dies zu umgehen, füge ich in -(NSMutableArray*)getExtendedVisibleIndexPathsForTableView: (UITableView*)tableView
den sichtbaren Array-Zellen Randzellen hinzu:
Dadurch habe ich die Zeit für das Öffnen von Sektionen mit einer großen Anzahl von benutzerdefinierten Zellen reduziert, was von Instruments verfolgt und gespürt wurde, während ich die App erlebte.
Überprüfen Sie Ihre Tabellenansicht. Möglicherweise ist Ihre Tabellenansichtshöhe sehr groß, sodass die Zellen so lange geladen werden, bis Ihre Zelle die gesamte Tabellenansichtsgröße erreicht.
Das scheint richtig zu sein. Die Idee, das Laden selbst zu optimieren, liegt darin, wie "dequeueReusableCellWithIdentifier" funktioniert. Wenn Sie das Bild von einem entfernten Standort laden, sollten Sie den Code optimieren. aber nicht vom Laden von Zellen, da dies hier richtig aussieht.
Ich habe eine ähnliche Technik verwendet, aber da indexPathsForVisibleRows sortiert ist, brauchen Sie kein containsObject. Stattdessen können Sie einfach tun:
%Vor%Übrigens; Dies setzt voraus, dass Sie nur einen Abschnitt verwenden. Es funktioniert nicht für mehr als einen Abschnitt.
Das Hinzufügen eines anderen löste mein Problem. Wo ich alle Änderungen zurückgesetzt habe, die an der Zelle vorgenommen wurden.
%Vor%Tags und Links uitableview ios