NSFetchResultsController с NSPredicate (связь) и базовый NSFetchRequest (изображение включено)

Вот изображение отношений, которые я обсуждаю: Настройка основных данных

У меня есть настройка UIScrollView как горизонтальный скроллер, который прокручивается между 3 разными UIViewControllers (конечно, содержащий UITableView и необходимые методы делегата и т. д.)

Каждый ViewController в UIScrollView загружает UITableView определенного MyObjectType.
(например, ViewController1 загружает табличное представление всех MyObjects, где его тип = = MyObjectType.name)

Имеет ли это смысл? Вы заметите, что я установил обратную связь между объектами. MyObjectType может иметь много MyObject, но с MyObject может быть связан только один MyObjectType.

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

Например. [type valueForKey:@"name"], где type – это полученный результат NSManagedObject из MyObjectType.

Дело в том, что мне интересно, когда я получаю этот NSManagedObject MyObjectType, у меня также нет доступа к массиву NSSet * (т.е. [type valueForKey:@"objects"]), который я могу использовать в качестве источника данных UITableView? Будет ли это работать, если после добавления или удаления объекта я сохраню manageContext, а затем всегда [tableView reloadData]?

Я предполагаю, что это сработает, если мне не требуется, чтобы содержимое UITableView изменялось и обновлялось динамически по мере добавления нового MyObject этого типа? Для этого нам нужен NSFetchedResultsController, верно?

Вот мой код для загрузки ALL MyObject в UITableView (который работает):

- (NSFetchedResultsController *)fetchedResultsController {

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"MyObject" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
                          initWithKey:@"creationDate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:managedObjectContext sectionNameKeyPath:@"transientSectionDate" 
                                               cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

[sort release];
[fetchRequest release];
[theFetchedResultsController release];

return _fetchedResultsController;    

}

Может кто-нибудь ПОЖАЛУЙСТА, будьте так любезны, чтобы показать мое фактическое объявление NSPredicate, которое мне нужно для правильной загрузки ТОЛЬКО MyObject, чей MyObjectType.name == @"XXXXXX"? Предположим, что у меня уже есть MyObjectType.name, хранящийся в сохраненной NSString внутри ViewController.

Заранее спасибо!


person skålfyfan    schedule 16.03.2011    source источник


Ответы (1)


Строка формата предиката будет следующей:

@"ALL type.name=%@", typeName

Однако, поскольку у вас есть конкретный объект MyObjectType, у вас уже есть прямой доступ к необходимым объектам MyObject, и вам не нужно тратить время на их получение. Просто преобразуйте набор в отсортированный массив.

Чтобы быть в курсе текущих изменений, пока таблица активна, реализуйте observeValueForKeyPath:ofObject:change:context: в объекте источника данных tableview. Затем отправьте addObserver:forKeyPath:options:context: этому конкретному объекту MyObjectType следующим образом:

[anObjectType addObserver:self 
               forKeyPath:@"objects" 
                  options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) 
                  context:nil];

Теперь всякий раз, когда значение objects этого конкретного MyObjectType изменяется, источник данных табличного представления будет уведомлен и может изменить таблицу.

См. Руководство по наблюдению за ключом и значением для получения подробной информации.

person TechZen    schedule 16.03.2011
comment
Таким образом, реализация `observerValueForKeyPath:ofObject:change:context: гарантирует, что источник данных таблицы NSSet для MyObjectType будет автоматически обновляться при добавлении нового MyObject из MyObjectType? Это означает, что я могу отказаться от всего NSFetchedResultsController? - person skålfyfan; 17.03.2011