Cocoa Touch: когда NSFetchedResultsController становится необходимым для управления извлечением основных данных?

Я разрабатываю приложение для iPhone, которое интенсивно использует Core Data, прежде всего для его функций, подобных базам данных (таких как возможность устанавливать порядок сортировки или предикаты при запросах на выборку). Я представляю все данные, которые я получаю в различных UITableViewControllers.

Что я хотел бы знать, так это приблизительное представление о том, сколько объектов я могу получить, прежде чем станет хорошей идеей использовать NSFetchedResultsController для обработки запроса. В документах Core Data говорится, что хранилища SQLite считают "10000 объектов довольно небольшим набором данных", но в документации по NSFetchedResultsController говорится о том, что одновременно в памяти хранится "десятки объектов".

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

Является ли этот сценарий подходящим для использования NSFetchedResultsController, или я могу сойти с простого NSArray результатов? У меня нет проблем с управлением тонкостями контроллера (удобными методами получения объекта для пути индекса UITableView, добавлением новых объектов обратно в контекст и т. Д.), Мне просто интересно узнать об использовании памяти каждый подход.

Я должен отметить, что приложение будет предназначено в первую очередь для пользователей iPhone 3G (не S) и iPod Touch первого поколения, поэтому, пожалуйста, помните об ограниченности памяти этих платформ.

1 ответ

Решение

NSFetchedResultsController - невероятно удобный вспомогательный класс для взаимодействия Базовых данных с вашими UITableView. Я рекомендую использовать его с каждым табличным представлением, имеющим базовую базу данных. В каждом случае, для которого я его использовал, это значительно уменьшало объем кода, который мне приходилось писать.

С точки зрения производительности это также может привести к значительному улучшению. Вместо выборки во всем вашем наборе данных, если вы используете -setFetchBatchSize: с NSFetchRequest, который вы передаете в NSFetchedResultsController, вы можете выполнять пакетную выборку, когда выбираются только соответствующие данные, отображаемые в табличном представлении. Данные, которые больше не отображаются, также могут быть автоматически удалены из памяти (как я понимаю).

Для таблиц с умеренными или большими наборами данных это может привести к значительному выигрышу в производительности. Инженеры Apple говорят, что для базы данных из 10000 элементов это может сократить время запуска более чем на 80% и использование памяти на 50%.

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