лучшие практики - NSManagedObjectContextObjectsDidChangeNotification в iOS - PullRequest
10 голосов
/ 20 июля 2011

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

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

NSFetchedResultsController , кажется, соответствует вашим требованиям.Он будет эффективно управлять обработкой данных из базовых данных.Вы повторно используете один и тот же запрос на выборку для вашего контроллера представления календаря и контроллера представления карты.

2 голосов
/ 03 апреля 2012

Почему вы не можете просто получить последние данные непосредственно из CoreData в методе viewWillLoad или viewDidLoad.Это обеспечит наличие последних объектов.

Похоже, это будет более модульным и более чистым.

...