2012-06-23 7 views
6

Ich habe in den letzten Tagen versucht, ein Mysterium zu lösen, warum mein NSFetchedResultsController mit einer Stapelgröße von 20 immer alle meine Objekte sofort in den Speicher laden würde Wenn der Abruf beendet wurde, dauert die Anforderung ~ 20 Sekunden.Dynamische UITableView-Höhe mit Core Data-Objekten

Es stellt sich heraus, dass es war, weil in meinem heightForRowAtIndexPath die Höhe auf der Länge einer NSString-Eigenschaft jedes abgerufenen Objekts basiert, und beim Neuladen der Tabelle, wenn die Tabelle 2000 Zeilen hat, dann wird die Höhe berechnet für jede Zeile am Anfang, und da ich auf eine Texteigenschaft des Objekts zugreife, würde es in 2000 Objekten (in Chargen mit 20 Größen) gleich zu Beginn Fehler verursachen, was es für immer dauern würde. (Ich wusste nicht, Zeilenhöhe wurden alle am Anfang berechnet). Die Frage ist, ob ich einen Abrufergebnis-Controller mit einer Stapelgröße von 20 habe, aber meine Zeilenhöhen basieren auf einer Texteigenschaft des Objekts, die, wenn ich versuche, darauf zuzugreifen, das Objekt nicht verursachen würde ein Fehler mehr, aber tatsächlich in den Speicher geladen, was wäre ein Workaround zur Berechnung der Höhe?

Was sind meine Optionen?

+0

Was passiert, wenn Sie überprüfen, ob das Objekt ein Fehler ist, wenn es ist, geben Sie eine willkürliche Größe zurück, sonst erhalten Sie die Zeichenfolge und berechnen? Wird die Methode erneut aufgerufen, wenn die Zelle angezeigt wird? Ich rate nur hier. Das oder das Implementieren eines verzögerten Ladens (dh neue Zeilen werden beim Blättern hinzugefügt) scheinen die einzigen Optionen zu sein. – jrturton

+0

Kein heightForRow wird nur zu Beginn eines Reloads aufgerufen und nicht jedes Mal aufgerufen, wenn eine Zelle erscheint (wie bei cellForRow). Das habe ich auch gedacht, aber ich glaube nicht, dass es funktionieren würde. – Snowman

+0

Dachte, es klang zu einfach. – jrturton

Antwort

2

Interessante Frage. Um die Leistung zu steigern, würde ich eine Eigenschaft in Ihrem Modell erstellen, die die Länge für diesen Zeichenfolgetext speichert. Auf diese Weise müssen Sie nicht die Länge für jede Zeile im laufenden Betrieb berechnen, sondern haben eine vorberechnete Höhe.

Myabe könnte es andere wertvolle Lösungen geben.

+0

Aber ich müsste immer noch auf diese Integer-Eigenschaft zugreifen, was dazu führen würde, dass das Objekt kein Fehler mehr wäre und in den Speicher geladen würde. – Snowman

+1

@mohabitar Es ist nicht ganz richtig. Wenn Sie diese Eigenschaft in Ihre Abrufanforderung importieren und dann darauf zugreifen, wird der Zeichenfolgentext erst dann in den Speicher geladen, wenn Sie danach gefragt haben. Andernfalls bleibt die Texteigenschaft als Fehler erhalten. –

+0

Richtig, aber wenn ich auf die string -Eigenschaft zugreife, wird das Objekt, das die Zeichenfolge enthält, in den Speicher geladen (weil vorher ein Fehler aufgetreten ist). – Snowman

-1

Erstellen Sie eine statische Methode in Ihrer View-Controller-Klasse, die für die Berechnung der Höhe zuständig ist. Alles, was Sie für diese Funktion benötigen, ist ein NSString, und Sie sollten einen leicht berechneten CGFloat zurückgeben. Verwenden Sie diese Methode, um die benötigte Höhe Ihrer Elemente zurückzugeben, ohne sie zu instanziieren (Sie benötigen lediglich die Metadaten ihres Textes).

+0

Richtig, aber wie würde die Methode wissen, was der NSString ist, ohne die Objekte zu instanziieren? Der NSString ist eine Eigenschaft des Objekts und wenn das Objekt ein Fehler ist, ruft das Aufrufen von object.textProperty das Objekt in Speicher auf. – Snowman

+0

Dieses Problem bezieht sich auf Ihre Implementierung. Möglicherweise eine Problemumgehung, um diese Zeichenfolgen zu erhalten, ohne Instanzen zu erstellen? Es ist das Huhn und das Ei :) – Stavash