Основные данные 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
Другие вопросы по тегам