#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. Это было бы плохо. Вы не хотите подключать свой контроллер представления к сетевым вызовам. Контроллеры просмотра должны прослушивать основные данные.