Проблемы с кешированием CoreData в iPhone - PullRequest
2 голосов
/ 16 ноября 2010

Я работаю над приложением, которое использует Core Data и NSFetchedResultsController.Основным компонентом приложения является фильтрация элементов в индексированном табличном представлении на основе набора из примерно 15 предопределенных переключателей, которые соответствуют свойству или взаимосвязи моих управляемых объектов.В большинстве моих ситуаций я просматриваю набор из 300-400 объектов, поэтому кэширование / производительность не являются проблемой.Все очень быстро, без кеширования.

Тем не менее, есть часть моего приложения, которая в основном просматривает все объекты в моей базе данных CD (~ 15 000 элементов).Здесь я пытаюсь реализовать кэширование на NSFetchedResultsController для повышения производительности.Свойство cacheString для NSFetchedResultsController - это просто строковое значение предиката.Всякий раз, когда пользователь переключает переключатель фильтра, я создаю новый предикат, создаю новый NSFetchedResultsController и устанавливаю в кэш строковое значение нового предиката.Первый удар, чтобы получить все предметы (нефильтрованный), занимает ~ 7 секунд, а последующие удары - менее одного.

Что странно - и вот моя проблема - это то, что когда я перехожу к следующему шагу'табличного представления (я помещаю новый контроллер представления в контроллер nav, передавая ему ссылку на fetchedObjects NSFetchedResultsController), производительность значительно падает.Этот следующий вид - это, по сути, другое представление (представление с горизонтальной прокручиваемой страницей) списка таблиц предыдущего представления с одним элементом на экране одновременно.При переходе от одного элемента к другому доступ к предыдущему или следующему объекту в массиве fetchedObjects блокирует телефон примерно на 5 секунд.Продолжительность «блокировки» увеличивается по мере того, как вы переходите в массив fetchedObjects.Если 'i == 0', ощутимой задержки нет.Если «i == 10000», то для доступа к следующему объекту требуется около 15 секунд.Nuts!Если я отключу кеширование (или это запрос, который не был кеширован, поэтому нужно было получать свежие результаты), все, кроме начального запроса фильтра, выполняется быстро и быстро с нулевым лагом.

Включает ли кэширование ТОЛЬКО индексирование кешаинформация для табличного представления, а не для самих выбранных объектов?

Я не уверен, в чем здесь дело.Надеюсь, я объяснил это достаточно хорошо - дайте мне знать, если вы хотите увидеть какой-то код или вам нужна дополнительная информация.

Спасибо!Билли

1 Ответ

5 голосов
/ 16 ноября 2010

Хорошо, я выяснил, в чем моя проблема ...

По сути, запрос моего NSFetchedResultsController для управляемого объекта с помощью objectAtIndexPath: происходит НЕМНОГО быстрее, чем прямой переход к массиву fetchedObjects и запрос объекта objectAtIndex: (что, разумеется, я и делал), особенно когда ваш индекс попадает в тысячи , Я не уверен на 100%, почему это так. Я предполагаю, что NSFetchedResultsController делает некоторые полезные вещи, чтобы эффективно извлекать отдельные объекты, а не переходить прямо к необработанным данным. Поэтому я не думаю, что кеширование как-то связано с моей проблемой производительности.

Спасибо тем, кто проверил мой вопрос. Я надеюсь, что это помогает всем, у кого есть подобные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...