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

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

've deciphed - это прослушивание уведомлений в 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. Есть ли какой-то другой метод, который мне не хватает?

10
задан Z S 20 July 2011 в 05:54
поделиться