Вопрос по ios, row-height, uitableview, objective-c, core-data – Динамическая высота UITableView с объектами Core Data

7

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

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

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

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

Никакая heightForRow не вызывается только в начале перезагрузки и не вызывается каждый раз, когда появляется ячейка (как будет в cellForRow). Я тоже об этом думал, но не думаю, что это сработает ... Snowman
Думаю, это звучит слишком просто. jrturton
Что произойдет, если вы проверите, является ли объект ошибкой, если это так, верните произвольный размер, в противном случае получите строку и вычислите? Метод вызывается снова, когда ячейка входит для просмотра? Я просто догадываюсь здесь. Это или реализация отложенной загрузки (т. Е. Новые строки добавляются при прокрутке), кажется, ваши единственные варианты. jrturton

Ваш Ответ

2   ответа
-1

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

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

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

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

Но мне все еще нужно получить доступ к этому целочисленному свойству, которое больше не приведет к повреждению объекта и загрузке в память. Snowman
Да, я понимаю, но я думаю, что вы по-прежнему упускаете основной момент: размер пакета выборки равен 20. Из 2000 объектов 1985 г. они будут ошибочными, то есть их свойства еще не созданы. Чтобы вычислить высоту, мне нужно знать содержимое свойства объекта, и при обращении к этому свойству объект больше не будет ошибкой. Я думаю, я могу создать еще один запрос на выборку, который просто выбирает текстовое свойство без ограничения на размер пакета. Snowman
@mohabitar Вам необходимо рассчитать эту высоту, прежде чем отображать данные в табличном представлении. В другой точке жизненного цикла вашего приложения. Например, когда вы вставляете объекты.
Правильно, но когда я получаю доступ к свойству string, объект, который содержит строку, загружается в память (потому что раньше это была ошибка, необработанная). Snowman
@mohabitar Это не совсем так. Если вы предварительно загрузите это свойство в свой запрос на выборку, а затем получите к нему доступ, текст строки не будет загружен в память до тех пор, пока вы не потребуете его, в противном случае свойство text останется ошибкой.

Похожие вопросы