Проблемы с кешированием CoreData в iPhone

Я работаю над приложением, которое использует 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 ответ

Решение

Хорошо, я узнал, в чем заключалась моя проблема...

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

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

Другие вопросы по тегам