2012-06-23 5 views
6

Я пытался решить загадку за последние несколько дней, почему мой NSFetchedResultsController с размером партии 20 всегда будет ошибочным (то есть загружать в память) все мои объекты немедленно когда выборка завершена, в результате чего запрос займет ~ 20 секунд.Динамическая высота UITableView с объектами Core Data

Оказалось, что это произошло из-за того, что в моем heightForRowAtIndexPath высота основывалась на длине свойства NSString каждого выбранного объекта и, таким образом, при перезагрузке таблицы, если таблица имеет 2000 строк, тогда вычисляется высота для каждой строки в начале, и поскольку я получаю доступ к текстовому свойству объекта, он будет ошибочным в 2000 объектах (в 20 партиях размеров) в самом начале, заставляя его принимать навсегда. (Я не знал, что высоты строк были рассчитаны все в начале).

Итак, вопрос заключается в том, что если у меня есть контролер результатов выборки с размером партии 20, но мои высоты строк основаны на текстовом свойстве объекта, который, если я попытаюсь получить доступ, приведет к тому, что объект не будет ошибка больше, но на самом деле загружена в память, что будет обходным путем для расчета высоты?

Какие у меня варианты?

+0

Что произойдет, если вы проверите, является ли объект ошибкой, если он есть, верните произвольный размер, в противном случае получите строку и вычислите? Повторяется ли метод, когда ячейка входит в просмотр? Я просто догадываюсь. Это или реализация ленивой загрузки (некоторые новые строки добавляются по мере прокрутки) кажутся вашими единственными опциями. – jrturton

+0

Нет heightForRow вызывается только в начале перезагрузки и не вызывается каждый раз, когда появляется ячейка (например, cellForRow). Это то, о чем я тоже думал, но я не думаю, что это сработает. – Snowman

+0

Думал, что это звучит слишком просто. – jrturton

ответ

2

Интересный вопрос. То, что я сделал бы для повышения производительности, было бы создание свойства в вашей модели, которое хранит длину для этого строкового текста. Таким образом, вам не нужно рассчитывать длину для каждой строки на лету, но у вас есть предварительно рассчитанная высота.

Myabe могут быть другие ценные решения.

+0

Но мне все равно нужно получить доступ к этому свойству integer, что приведет к тому, что объект больше не будет виноват и будет загружен в память. – Snowman

+1

@mohabitar Это не совсем так. Если вы предварительно отфильтровываете это свойство в свой запрос на выборку, а затем получаете доступ к нему, текст строки не загружается в память до тех пор, пока вы не потребуете его, иначе свойство text останется как ошибка. –

+0

Правильно, но когда я получаю доступ к строковому свойству, объект, который удерживает строку, загружается в память (потому что это была ошибка до, неподтвержденная.) – Snowman

-1

Создайте статический метод в своем классе контроллера, который отвечает за вычисление указанной высоты. Все, что вам нужно для обеспечения этой функции, - это NSString, и она должна возвращать легко вычисляемый CGFloat. Используйте этот метод для возврата необходимой высоты ваших элементов без их создания (все, что вам нужно, это метаданные их текста).

+0

Правильно, но как бы метод знал, что такое NSString, не создавая экземпляры объектов? NSString является свойством объекта, и если объект является ошибкой, вызов object.textProperty заставляет объект загружаться в память. – Snowman

+0

Эта проблема связана с вашей реализацией. Может быть, обходной путь для получения этих строк без создания экземпляров? Это цыпленок и яйцо :) – Stavash

Смежные вопросы