Основные данные iOS 8 Сегодня виджет выпуска
У меня есть класс DataManager, который возвращает общий экземпляр:
+ (DataManager *)sharedInstance;
{
static DataManager *sharedInstance = nil;
static dispatch_once_t pred;
dispatch_once(&pred, ^{
sharedInstance = [[DataManager alloc] init];
});
return sharedInstance;
}
Здесь я отслеживаю мой managedObjectContext, managedObjectModel, persistentStoreCoordinator.
У меня также есть метод, где я вынимаю элементы для отображения:
- (NSArray *)getItems
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
return [[self managedObjectContext] executeFetchRequest:fetchRequest error:nil];
}
Теперь в моем основном приложении у меня есть контроллер представления, когда я вызываю этот getItems, а затем изменяю элементы по отдельности. Так, например, set item.itemName = @"testName"; а затем вызовите мой метод сохранения.
У меня также есть iOS 8, где в моем TodayViewController я также вызываю метод getItems. У меня есть NSNotification, который обнаруживает для сохраненного управляемого ObjectContext.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refetchItems) name:NSManagedObjectContextDidSaveNotification object:[[DataManager sharedInstance] managedObjectContext]];
Эти восстановленные элементы действительно вызывают, но возвращают устаревшие NSManagedObjects. Так, например, itemName не изменилось на @"testName".
Куда я иду не так? Дайте мне знать, если вам нужно увидеть любой другой код.
Спасибо!
1 ответ
Вы можете попробовать следующее для обновления конкретного ManagedObject. А если вы хотите обновить список ManagedObject, выполните цикл каждого объекта и выполните команду.
[_managedObjectContext refreshObject:act mergeChanges:YES];
Или для iOS версии 8.3 и выше вы можете использовать следующий метод для обновления всего ManagedObject в контексте сразу, как указано ниже.
[_managedObjectContext refreshAllObjects];
Это работает немного, но только для данных ОБНОВЛЕНИЕ, а не для добавления или удаления данных.
Если это не работает, вы также можете добавить
[_managedObjectContext reset];
после этого вы должны прочитать "переназначить" все переменные, которые вы загрузили из основного хранилища данных.
Другое решение (медленнее и уродливее)
Если вышеупомянутое не работает, другое решение было бы удалить текущий контекст и создать его снова.
Я просто поставил
_persistentStoreCoordinator = nil;
_managedObjectModel = nil;
_managedObjectContext = nil;
У меня есть класс CoreDataManager с этими свойствами
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
И в классе я создал сеттеры вручную. Если я обнуляю все переменные из-за сеттеров, они снова запускаются, как только я читаю их вне своего основного класса менеджера данных.
Вы можете улучшить это, используя NSUserDefault
хранить. Он обновляется правильно. В основном приложении, если вы меняете что-то, установите флаг в NSUserDefault
, В расширении, прочитайте это и, если флаг помечен, сбросьте основные данные. Таким образом, вы сэкономите некоторые тики и сделаете все немного быстрее.
Для выделения NSUserDefault
(в обоих приложениях - расширение и основное) используйте это - после этого вы можете читать данные с него как обычно, и они должны быть синхронизированы
NSUserDefaults *prefs = [[NSUserDefaults alloc] initWithSuiteName:GROUP_NAME]; //share with extension