Каков эффект кеша для NSFetchedResultsController - PullRequest
3 голосов
/ 13 октября 2011

Я, конечно, читаю документацию, но не совсем понимаю, что такое «настройка каких-либо разделов и упорядочение содержимого».

  1. Разве такого рода информация не поступает из базы данных?
  2. Означает ли это, что NSFetchedResultsController нужны и другие индексы, помимо индексов базы данных?
  3. Что на самом деле происходит, когда NSFetchedResultsController устанавливает кэш?
  4. Кэш полезен только для статических данных? Если мои данные часто обновляются, я должен использовать кеш или нет?
  5. Как мне профилировать производительность кеша? Я пробовал кеш, но не увидел улучшения производительности. Я рассчитал -performFetch:, но увидел увеличение времени с 0,018 с (без кеша) до 0,023 с (с кешем). Я также рассчитал -objectAtIndexPath: и только время уменьшилось с 0,000030 (без кеша) до 0,000029 (с уловом).

Другими словами, я хочу знать, когда кеш повышает (или не увеличивает) производительность и почему.

Как указал @Marcus ниже: «500 записей - это крошечные. Базовые данные могут справиться с этим без заметного отставания человека. Кэширование используется, когда у вас есть десятки тысяч записей». Поэтому я думаю, что есть несколько приложений, которые выиграли бы от использования кэша.

Ответы [ 3 ]

7 голосов
/ 13 октября 2011

Кеш для NSFetchedResultsController является своего рода сокращением.Это кеш последних результатов из NSFetchRequest.Это не полные данные, но достаточно данных для NSFetchedResultsController для быстрого отображения результатов;очень быстро.

Это «копия» данных из базы данных, которая сериализуется на диск в формате, который легко используется NSFetchedResultsController при его следующем создании.Посмотрите на это по-другому, последние результаты флэш-памяти заморожены на диск.

0 голосов
/ 03 июня 2019

Из документации

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

Когда вы инициализируете экземпляр NSFetchedResultsController, вы обычно указываете имя кэша.(Если вы не укажете имя кэша, контроллер не будет кэшировать данные.) Когда вы создаете контроллер, он ищет существующий кэш с данным именем:

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

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

Если кеш соответствует текущей информации, контроллер повторно использует ранее вычисленную информацию.

Если кеш не соответствует текущей информации, то необходимая информация пересчитывается и кэш обновляется.

Каждый раз, когда изменяется раздел и информация о заказе, кэш обновляется.

Если у вас есть несколько контроллеров извлеченных результатов с разными конфигурациями (разные дескрипторы сортировки и т. Д.), Вы должны назначить каждому свой кеш.name.

Вы можете очистить кеш, используя deleteCache (withName:).

0 голосов
/ 27 августа 2012

Из документации из NSFetchedResultsController:

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

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

Так что, если в initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName: установить sectionNameKeyPath на nil, вы, вероятно, не заметите никакого увеличения производительности.

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