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 刷新的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cocoa (Mac) 在 Swift 中创建 PDF

如何为 Mac 创建 Cocoa App 首选项?

Mac Cocoa:无法释放窗口以取回其内存

(Mac) Cocoa 应用程序更改核心转储位置

MAC COCOA一个简单的多线程程序

更改显示的窗口 (Mac - Cocoa)