Динамическая высота UITableView с объектами Core Data
Последние несколько дней я пытался разгадать загадку, почему мой NSFetchedResultsController с размером пакета 20 всегда будет давать сбой (то есть загружать в память) все мои объекты сразу после завершения выборки, вызывая запрос займет ~ 20 секунд.
Оказывается, это потому, что в моем heightForRowAtIndexPath высота основывалась на длине свойства NSString каждого извлеченного объекта, и поэтому при перезагрузке таблицы, если в таблице 2000 строк, высота вычисляется для каждой строки в в начале, и так как я получаю доступ к текстовому свойству объекта, в самом начале он будет поврежден в 2000 объектах (в 20 пакетах размера), заставляя его работать вечно. (Я не знал, что высоты строк были рассчитаны все в начале).
Таким образом, вопрос в том, есть ли у меня контроллер результатов выборки с размером пакета 20, но моя высота строки основана на свойстве text объекта, которое, если я попытаюсь получить доступ, приведет к тому, что объект больше не будет ошибкой, но на самом деле загружается в память, что будет обходным путем для расчета высоты?
Какие у меня варианты?
2 ответа
Интересный вопрос. Чтобы повысить производительность, я хотел бы создать свойство в вашей модели, в котором будет храниться длина этого строкового текста. Таким образом, вам не нужно рассчитывать длину для каждой строки на лету, но у вас есть заранее рассчитанная высота.
Мябе могут быть и другие ценные решения.
Создайте статический метод в вашем классе контроллера представления, который отвечает за вычисление указанной высоты. Все, что вам нужно для предоставления этой функции - это строка NSString, и она должна возвращать легко вычисляемый CGFloat. Используйте этот метод для возврата необходимой высоты ваших элементов без их создания (все, что вам здесь нужно, это метаданные их текста).