2012-05-16 3 views
1

Визуально у меня есть UITableView с UISegmentedControl, чтобы разрешить выбор режима, который изменит порядок сортировки таблицы.Mutiple NSFetchedResultsController с одним UITableView?

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

Тем не менее, я вижу, что это будет сложно с 4 различными NSFetchedResultsController отправляет все сообщения делегатов для обновления UITableView. Чтобы справиться с этим, я планирую использовать блок switch() в каждом из соответствующих методов, чтобы игнорировать всех, кроме текущего «активного» NSFetchedResultsController.

Звучит ли это как правильный подход, или я пропустил что-то очевидное здесь?

-I можно увидеть потенциал для катастрофы, если пользователь изменяет «режим» так же, как обновление приходит через (то есть между controllerWillChangeContent: и controllerDidChangeContent:)

ответ

1

Я использовал элемент управления сегмента, чтобы изменить сортировку/группировку в нескольких приложениях Core Data. Во всех из них я всегда использовал единственный NSFetchedResultsController и повторно запрашивал базу данных при изменении сегмента.

Как вы правильно поняли, это гораздо более простая реализация, меньше шансов на непредвиденные ошибки, а также больше масштабируемое. Например. что, если я решит добавить новый сегмент сортировки/группировки на основе отзывов клиентов? Сколько NSFetchedResultsController вы собираетесь продолжать добавлять? В какой-то момент (5 или 6) это становится просто смешным.

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

Итак, мое предложение состоит в том, чтобы перейти к более простой реализации, которая является единственным NSFetchedResultsController, и воссоздавать ее каждый раз, когда сегмент изменяется. Если вы заинтересованы в кешировании, вы можете использовать отдельное имя кеша для каждого сегмента. Для каждого сегмента можно создать уникальное имя кеша, объединив что-то вроде:

[NSString stringWithFormat:@"Cache_%d", segment_index] 
1

Разве не логичнее, когда выбран индекс сегментированного элемента управления изменяется , чтобы изменить дескрипторы сортировки и выполнитьFetch?

self.fetchedResultsController.fetchRequest.sortDescriptors = [NSArray ... ]; 
+0

В t он тратит на потерю кэширования каждого режима. Хотя я могу видеть, как это намного проще, чем пытаться манипулировать 4 одновременно. – trapper

+0

Действительно ли зависят от кэша? И почему бы вам не попробовать при переключении сегмента, чтобы установить контроллер, который в настоящее время используете делегат для себя, а остальные три - к нулю. то ваши методы делегирования будут срабатывать только для активного контроллера ... – graver

Смежные вопросы