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