Основные данные 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 4

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