2014-09-18 82 views
4

我有一个DataManager类返回的共享实例:核心数据的iOS 8今天的Widget问题

+ (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然后分别修改项目。因此,例如设置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

你的应用程序,你运行的小部件在不同的过程。如果您的应用更改了核心数据存储,那么您的小部件将不会收到该应用发送的通知。 – quellish 2014-09-19 01:54:56

+0

@quellish然后检测变化的最佳方式是什么? – Stephen 2014-09-19 08:10:26

+1

我有完全相同的问题,但还没有找到解决方案。只有我能想到,就是“去创造”背景并重新创造它。 – 2014-09-20 17:11:30

回答

7

您可以尝试以下操作来刷新特定的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; 

在课堂上我已经手动创建的制定者。如果由于setter的原因,我会删除所有变量,一旦我在核心数据管理器类以外的地方读取它们,它们就会再次被引用。

您可以使用NSUserDefault商店来改善此情况。它正在被正确更新。在主应用程序中,如果您更改smend,请在NSUserDefault中设置标志。在扩展中,请阅读此内容,如果标记被标记,则重置核心数据。这样,你可以节省一些滴答,让事情变得更快一点。

对于NSUserDefault分配(在这两个应用 - 延伸和主)使用 - 在这之后,你可以为usuall从中读取数据,他们应该是同步的

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

非常感谢您的投入! – Stephen 2014-09-21 17:32:16