Измените свойство в NSManagedObject, отправляет ли оно уведомление?

#ios #objective-c #core-data #nsmanagedobject

#iOS #objective-c #core-data #nsmanagedobject

Вопрос:

Могу ли я изменить свойство в NSManagedObject в одном месте и получить уведомление в другом месте?

Мне нужно загрузить кучу фотографий и информацию о каждой фотографии с сервера. В моей модели данных я извлекаю всю информацию о фотографии, затем передаю NSManagedObject пользовательскому UIView для отображения фотографии и изображения фотографии. Я еще не установил UIImageView изображение, потому что у меня его нет.

Затем моя модель начинает асинхронно извлекать каждую фотографию с сервера. Когда загрузка фотографии завершена, я хочу установить NSManagedObject свойство для фотографии (просто свойство NSData). Когда я это делаю, я хочу, чтобы пользователь UIView получал уведомление об изменении объекта и устанавливал UIImaveView изображение на то, что было только что загружено.

Возможно ли, чтобы мой пользовательский UIView интерфейс определял, когда изменился NSManagedObject?

Я только спрашиваю, потому что я заметил, что когда я добавляю категорию в a NSManagedObject , когда я хочу установить свойство, рекомендуется делать это следующим образом:

 -(void)setHasNewData:(NSNumber *)hasNewData {
    [self willAccessValueForKey:@"hasNewData"];
    [self setPrimitiveValue:hasNewData forKey:@"hasNewData"];
    [self didAccessValueForKey:@"hasNewData"];

    self.modifiedDateLocal = [NSDate date];
}
  

Комментарии:

1. Что не так NSNotificationCenter postNotification ?

Ответ №1:

Во-первых, я бы не рекомендовал использовать подобный метод доступа. Вам лучше использовать динамическое свойство, а затем переопределить метод жизненного -willSave цикла и установить там измененную дату. Таким образом, вы получаете измененную дату, когда она сохраняется на диске, и обновление даты изменения происходит один раз за сохранение. Вы можете сделать что-то вроде:

 - (void)willSave
{
  [super willSave];
  if ([self changedValues][@"modifiedDateLocal"] == nil) return;
  [self setModifiedDateLocal:[NSDate date]];
}
  

Когда происходит сохранение, Core Data будет вызывать -willSave каждый объект непосредственно перед сохранением. Если объект что-то меняет, процесс запускается заново. Поэтому мы проверяем, чтобы убедиться, что мы еще не изменили modifiedDateLocal , чтобы избежать бесконечного цикла.

Что касается вашего UIView, вы можете либо использовать KVO (наблюдение за значением ключа) для наблюдения за свойством в определенном экземпляре a NSManagedObject , либо вы можете прослушивать NSManagedObjectContextObjectsDidChangeNotification , которое будет срабатывать в любое время, когда изменяется какое-либо свойство для любого объекта. Имейте в виду, что это очень болтливый и, следовательно, дорогой.

Комментарии:

1. Единственный другой вариант, который я могу придумать, — позволить пользовательскому представлению вызывать сервер для загрузки и отображения после завершения и сохранения изменений. Похоже, это нарушает MVC, но кажется наиболее простым.

2. Это было бы плохо. Вы не хотите подключать свой контроллер представления к сетевым вызовам. Контроллеры просмотра должны прослушивать основные данные.