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