Правильно использовать NSFetchedResultsController кеш - PullRequest
14 голосов
/ 15 июля 2011

Я использую NSFetchedResultsController для работы с UITableView, и все работает отлично, и я нашел его очень мощным, особенно в сочетании с делегатом результатов. Для детализации таблицы я повторно использую тот же класс контроллера, который создается с параметрами путем щелчка по строке ячейки, затем контроллер помещается в UINavigationController и создается другое табличное представление, снова с NSFetchedResultsController.

На этом этапе каждый контроллер имеет свой собственный кеш, а имя кеша выводится с помощью уникального идентификатора [NSString stringWithFormat "cacheName _% @", uniqueStringForCell], и, в конце концов, я, очевидно, могу иметь много кешей.

Теперь вопросы.

1) Наличие большого количества кэша может быть проблемой?

2) Когда мы должны использовать кеш?

3) В случае deleteCacheWithName, где лучше всего разместить такой метод? Я попытался в viewWillDisappear, но с этим я полагаю, у меня могут возникнуть проблемы, когда представление появится снова и кеш больше не присутствует, например, при использовании с UINavigationController. Возможно, метод dealloc - лучшее место?

4) Какая связь между кешем и управлением памятью? Я имею в виду, когда (void) didReceiveMemoryWarning отправляется мне нужно удалить кэш? Если да, как насчет его восстановления? Какой предпочтительный способ, может быть, выдача выручки?

5) у контроллера выборки делегат установлен в UITableViewController (fetchController.delegate = self), есть ли проблемы с этим? В некотором смысле, что в случае изменения более одного контроллера оповещены? И deleteCacheWithName также удаляет делегата?

спасибо

1 Ответ

11 голосов
/ 29 августа 2011

Чтобы ответить (на некоторые) ваши вопросы:

1) Наличие нескольких кэшей не является проблемой. На самом деле, из справочника класса Apple:

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

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

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

3) Я лично поместил deleteCacheWithName в метод viewDidUnload. Не уверен, что это лучшее место или нет.

Не уверен насчет 4. С точки зрения восстановления кеша - это должно происходить автоматически, если текущий кеш не синхронизирован с приложением. Я не сделал ничего конкретного для управления памятью и кешем ни в одном из моих приложений.

5) Это не должно быть проблемой. Опять же, из документации Apple:

  • Если вы установите делегата для контроллера полученных результатов, контроллер регистрируется для получения уведомлений об изменениях от своего управляемого контекст объекта. Любое изменение в контексте, которое влияет на набор результатов или информация раздела обрабатывается и результаты обновляются соответственно. Контроллер уведомляет делегата, когда объекты результата изменить местоположение или когда разделы изменены (см. NSFetchedResultsControllerDelegate). Вы обычно используете эти методы обновить отображение табличного представления.

К вашему сведению, вот ссылка на документы Apple Dev для этого класса: http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html

НТН

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