核心数据iOS 8今日小工具问题

时间:2014-09-18 23:49:00

标签: ios objective-c ios8 ios-app-extension notificationcenter

我有一个返回共享实例的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来检测managedObjectContext保存。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refetchItems) name:NSManagedObjectContextDidSaveNotification object:[[DataManager sharedInstance] managedObjectContext]];

这些重新获取的项目会被调用,但会返回过时的NSManagedObjects。例如,itemName没有更改为@“testName”。

我哪里错了?如果您需要查看任何其他代码,请与我们联系。

谢谢!

1 个答案:

答案 0 :(得分:7)

您可以尝试以下方法来刷新特定的ManagedObject。如果要刷新ManagedObject列表,则循环每个对象并执行命令。

[_managedObjectContext refreshObject:act mergeChanges:YES];

或者对于iOS版本8.3及更高版本,您可以使用以下方法一次更新上下文中的所有ManagedObject,如下所示。

[_managedObjectContext refreshAllObjects];

它有点工作,但仅适用于数据UPDATE,而不适用于添加或删除数据。

如果它不起作用,您也可以添加

[_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;

在课堂上我手动创建了setter。如果由于setter而导致所有变量无效,那么一旦我在核心数据管理器类之外读取它们,它们就会再次出现。

您可以使用NSUserDefault商店来改善这一点。它正在正确更新。在主应用程序中,如果您更改了smething,请在NSUserDefault中设置标记。在扩展中,读取此标志并标记标志,重置核心数据。通过这种方式,您可以节省一些刻度并使事情变得更快。

要分配NSUserDefault(在两个应用中 - 扩展名和主要版本),请使用此功能 - 之后,您可以通过它来读取数据并且它们应该同步

NSUserDefaults *prefs = [[NSUserDefaults alloc] initWithSuiteName:GROUP_NAME]; //share with extension