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