我有一个返回共享实例的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”。
我哪里错了?如果您需要查看任何其他代码,请与我们联系。
谢谢!
答案 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