如何强制NSArrayController重新加载MOC内容以反映最新的新数据

时间:2012-12-27 03:30:56

标签: macos core-data icloud cocoa-bindings nsarraycontroller

我正在使用Mac& iOS App,中间使用iCloud CoreData来同步数据。

当我从iOS App更新某些内容时,在Mac App运行时,更新已经迁移到Mac App中的PersistentStore。问题是我找不到强制NSArrayController重新加载商店中所有数据的有效方法。

尝试 - (void)fetch:(id)sender;只能看到删除或添加的实体,但更新的模型属性未刷新...

请帮忙。感谢

4 个答案:

答案 0 :(得分:1)

我发现了

[self.managedObjectContext reset];
[myArrayController fetch:self];

强制我的NSTableView(使用NSArrayController)重新填充并显示新处理的NSManagedObjects。

答案 1 :(得分:1)

如果您在托管对象上下文中看到最新数据,但在阵列控制器中没有,则需要:

[_yourManagedObjectContext processPendingChanges];
[_yourArrayController fetchWithRequest:nil merge:YES error:&error];
[_yourArrayController rearrangeObjects];

我在Mac / iOS iCloud应用程序中使用它来在iCloud存储更改时更新Mac应用程序的数据。

答案 2 :(得分:1)

以下是Apple开发者技术支持部门的回复。它对我有用。感谢所有提供解决方案。

  

对于OS X应用程序,当调用reloadFetchResults时,您可以要求NSManagedObjectContext重置自身并再次执行提取。

- (void)reloadFetchedResults:(NSNotification *)note
{
NSDictionary *userInfoDict = [note userInfo];

NSManagedObjectContext *moc = self.coreDataController.mainThreadContext;

// this only works if you used NSMainQueueConcurrencyType
// otherwise use a dispatch_async back to the main thread yourself
//
[moc performBlock:^{
    [self mergeiCloudChanges:userInfoDict forContext:moc];

    [moc reset];
    [self.tableArrayController fetch:self];
}];
}

答案 3 :(得分:0)

万一其他人发现这个...... 在我的情况下,我是从用户交互(而不是核心数据)构建数组,然后尝试在完成它们时(在同一个窗口上)显示tableView ......当然......什么都看不见!

[arrayController rearrangeObjects];

就在我想要显示tableView为我修复它之前。