Я пишу свое первое всеобъемлющее приложение, используя 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. Есть ли какая-то другая техника, которую мне не хватает?