保存核心数据条目并且它们不能直接用于获取,为什么?

时间:2014-07-21 15:21:37

标签: ios objective-c core-data nsfetchedresultscontroller

为了学习如何重构等,我将所有核心数据和nsfetchcontrollers移动到两个类,一个用于管理所有核心数据方法,另一个用于处理所有提取。我有一个问题,即除非我重新启动应用程序或添加更多数据,否则最后输入的数据不可见。

我有两个viewcontrollers,第一个(A)显示数据,第二个(B)用户可以输入数据。

我的核心数据类是单例,dataManager和我的提取类称为fetchManager。在每个viewController的ViewDidLoad中我这样做:

dataManager = [XEPDataManager sharedInstance];
self.managedObjectContext = dataManager.managedObjectContext;
self.fetchManager = [[XEPResultFetchedController alloc] initWithContext:self.managedObjectContext];

然后在A中我在viewWillAppear中执行提取并显示数据量。

1. NSLog(@"Count: %i", [[fetchManager fetch] count]);
B中的

我创建了一个新实体,在我回到A之前,我在viewWillDisappear中执行保存。

2. 
if (![self.managedObjectContext save:&error]) {
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}

我遇到过这样的事情:

  1. 启动应用
  2. 查看A
  3. 数:0
  4. 转到B,输入数据然后返回A.
  5. 数:0(预期1)
  6. 重复步骤4
  7. 数:1(预期2)
  8. 重新启动应用 9:数:2 10:重复步骤4 11:伯爵:2
  9. 很明显数据已经保存了......但不知何故并不是直接的,我首先想到的是,当我分配“本地版本”(不确定这是否有效)时,我正在处理上下文。在我在viewDidAppear中获取但没有运气之前,我尝试使用我的单例数据管理器中的一个更新我的获取管理器中的上下文。

    任何人都知道它会是什么?

1 个答案:

答案 0 :(得分:1)

原因是保存上下文是异步的。完成后,您会收到通知。正确的方法是实现nsfetchcontroller的委托方法。通过这种方式,您可以在发生某些事情时获得回调,并且可以相应地更新UI。