Лучшие практики - NSManagedObjectContextObjectsDidChangeNotification в iOS

Я пишу свое первое всестороннее приложение с использованием Core Data, и я хочу посмотреть, какой лучший способ отслеживать различные изменения/обновления/удаления объектов. Например, у меня есть объект Notes и объект Location, а также взаимно-однозначная взаимосвязь между ними, и идея состоит в том, что каждая заметка может помечать свое местоположение. Затем у меня есть UITableView с fetchedResultsController, управляющий списком заметок (где вы можете добавлять новые заметки и прикреплять к ним дату и место), но затем у меня есть еще два контроллера вида: один с видом карты и один с календарным видом, В окне карты отображаются все местоположения в Location и отображаются на карте. В режиме календаря в основном все данные из Notes снова отображаются и отображаются только в виде календаря. Как мне отслеживать изменения в Notes и Location в моем календаре и в режиме просмотра карты? Легко загружать их один раз в viewDidLoad, но как я должен отслеживать все изменения, так что, когда пользователь снова просматривает карту (например,), он видит последние данные.

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

В MapViewController viewDidLoad:

[[NSNotificationCenter defaultCenter]
    addObserver: self
    selector: @selector(objectChangedNotificationReceived:)
    name: NSManagedObjectContextObjectsDidChangeNotification
    object: context];

Тогда:

- (void) objectChangedNotificationReceived: (NSNotification *) notification
{
    NSArray* insertedObjects = [[notification userInfo]
                                objectForKey:NSInsertedObjectsKey] ;
    NSArray* deletedObjects = [[notification userInfo]
                               objectForKey:NSDeletedObjectsKey] ;
    NSArray* updatedObjects = [[notification userInfo]
                               objectForKey:NSUpdatedObjectsKey] ;
    NSLog(@"insertObjects: %@", [insertedObjects description]);
    NSLog(@"deletedObjects: %@", [deletedObjects description]);
    NSLog(@"updatedObjects: %@", [updatedObjects description]);

    for (NSManagedObject *obj in insertedObjects) {
        if ([obj class] == [Location class]) {
            NSLog(@"adding a new location");
            Location *locationObj = (Location *) obj;
            [self.mapview addAnnotation: locationObj];
        }
    }
}

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

Ответ 1

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

Ответ 2

Почему вы не можете просто получать последние данные непосредственно из CoreData в методе viewWillLoad или viewDidLoad. Это гарантирует, что у вас есть последние объекты.

Похоже, это было бы более модульным и чистым.