Cocoa Mac 应用程序和 NSTableView 不使用 NSArrayController 和 NSManagedObjectContext 刷新
Posted
技术标签:
【中文标题】Cocoa Mac 应用程序和 NSTableView 不使用 NSArrayController 和 NSManagedObjectContext 刷新【英文标题】:Cocoa Mac app and NSTableView don't refresh with NSArrayController and NSManagedObjectContext 【发布时间】:2014-04-01 15:21:25 【问题描述】:我正在开发一个新的 Core Data 应用程序并创建了一个 NSArrayController(实体模式)来进行绑定,它工作得很好,但是当 SQLite 存储更改时(更改来自使用 TICoreDataSync 库的其他客户端)我强制重新加载 tableView没有成功。代码如下:
NSError *saveError = nil;
[self.managedObjectContext save:&saveError];
if (saveError != nil)
NSLog(@"%s %@", __PRETTY_FUNCTION__, saveError);
[arrayController fetch:nil];
[tableView reloadData];
如果我关闭应用程序并重新启动它,我可以在我的 tableView 中看到更改,但我希望它自动刷新。提前致谢。
【问题讨论】:
【参考方案1】:当 TICDS 进行更改时,您是否致电 mergeChangesFromContextDidSaveNotification:
更新您的上下文?
你应该实现这个委托方法:
-(void)documentSyncManager:(TICDSDocumentSyncManager *)aSyncManager
didMakeChangesToObjectsInBackgroundContextAndSaveWithNotification:(NSNotification *)aNotification
确保在适当的线程上调用 mergeChangesFromContextDidSaveNotification:
。
还值得一看我正在开发的名为Ensembles 的同步框架。这些天来,TICDS 没有得到太多维护——我过去一直在研究它——而且 Ensembles 更容易使用。
【讨论】:
感谢您向我推荐 Ensembles 框架,我会看看,我正在使用 TICDS 处理已经运行的 ios 应用程序的 OSX 客户端,因此我应该计划迁移。我尝试了委托方法但没有成功: -(void)documentSyncManager:(TICDSDocumentSyncManager *)aSyncManager didMakeChangesToObjectsInBackgroundContextAndSaveWithNotification:(NSNotification *)aNotification [arrayController fetch:nil]; [tableView 重新加载数据]; 【参考方案2】:我在 fetch 之前添加了以下行,它可以工作:
[arrayController setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
这对我来说很好,但我不明白为什么每次开始获取时都需要设置它,managedObjectContext 是在启动时设置的,否则一旦应用启动它就不会显示值。
【讨论】:
以上是关于Cocoa Mac 应用程序和 NSTableView 不使用 NSArrayController 和 NSManagedObjectContext 刷新的主要内容,如果未能解决你的问题,请参考以下文章