Основные данные 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, а затем изменяю элементы по отдельности. Так например установлен пункт.itemName = @ "testName"; а затем вызовите мой метод сохранения.
У меня также есть iOS 8, где в мой TodayViewController я также называю getitems метод. У меня есть NSNotification, который обнаруживает для managedObjectContext сохраняет.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refetchItems) name:NSManagedObjectContextDidSaveNotification object:[[DataManager sharedInstance] managedObjectContext]];
Эти рефетчированные элементы действительно вызываются, но возвращают устаревшие NSManagedObjects. Так, например, имя элемента не изменилось на @ "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;
И в классе я вручную создал сеттеров. Если я обнулю все переменные, то из-за сеттеры, они снова вводятся, как только я читаю их за пределами моего класса core data manager.
Вы можете улучшить это, используя
NSUserDefault
магазин. Он обновляется правильно. В главном приложении, если вы измените smething, установите флаг вNSUserDefault
. В расширении прочтите это и, если флаг отмечен, сбросьте основные данные. Таким образом, вы сэкономите несколько тиков и сделаете все немного быстрее.Для выделения
NSUserDefault
(в обоих приложениях - extension и main) используйте это - после этого вы можете читать данные из него как обычно и они должно быть синхронизированоNSUserDefaults *prefs = [[NSUserDefaults alloc] initWithSuiteName:GROUP_NAME]; //share with extension