лучшие практики — NSManagedObjectContextObjectsDidChangeNotification в iOS

Я пишу свое первое всеобъемлющее приложение, используя Core Data, и я хочу посмотреть, как лучше всего отслеживать различные изменения/обновления/удаления объектов. Например, у меня есть объект «Заметки» и объект «Местоположение», а также отношение «один к одному» между ними, идея заключается в том, что каждая заметка может иметь тег своего местоположения. Затем у меня есть UITableView с fetchedResultsController, управляющим списком заметок (где вы можете добавлять новые заметки и привязывать к ним дату и местоположение), но затем у меня есть 2 других контроллера представления, один с представлением карты и один с представлением календаря . Представление карты извлекает все местоположения в Location и отображает их на карте. Представление календаря в основном снова получает все данные из Notes и просто показывает их в представлении календаря. Как мне отслеживать изменения в заметках и местоположении в календаре и на карте? Их легко загрузить один раз в 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. Есть ли какая-то другая техника, которую мне не хватает?


person Z S    schedule 20.07.2011    source источник
comment
Разве NSInsertedObjectsKey не возвращает NSSet, а не NSArray?   -  person Loc Pham    schedule 21.09.2018


Ответы (2)


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

person nhisyam    schedule 03.04.2012
comment
В итоге я использовал NSFetchedResultsController, хотя у моих представлений не было связанного с ними табличного представления, и это работает как шарм! - person Z S; 04.04.2012
comment
@ZS Очевидно, что NSFetchedResultsController НЕ должно быть связано с tableView. - person DawnSong; 03.12.2015

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

Кажется, это было бы более модульным и чистым.

person RyanJM    schedule 03.04.2012
comment
Слишком много накладных расходов. Создание FRC, который прислушивается к изменениям за вас, — это правильный путь. - person Z S; 04.04.2012