在重新加载文档之前,如何在 OS X 上的 iCloud 中检测对 Core Data 文档的更改?

Posted

技术标签:

【中文标题】在重新加载文档之前,如何在 OS X 上的 iCloud 中检测对 Core Data 文档的更改?【英文标题】:How do I detect changes to a Core Data document in iCloud on OS X before the document gets reloaded? 【发布时间】:2014-02-18 20:39:03 【问题描述】:

我目前正在开发一个基于 OS X 和 ios 并使用 Core Data 的文档应用程序。为了使两个平台上的文档相同,我在 OS X 端使用BSManagedDocument。

如果我同时在两个平台上启动应用程序并在每个平台上打开相同的文档,我可以在 OS X 端进行更改并在 iOS 端收到两个通知(一个在文档状态变为禁用编辑时,另一个在它恢复正常)。我可以轻松地使用第二个作为触发器来更新 UI,让 iOS 端正常工作。

问题是当我在 iOS 端进行更改时。发生这种情况时,文档窗口会重新打开(我已验证 windowControllerDidLoadNib: 正在被调用)。在一个简单的应用程序中,这主要只是一个小问题(尽管需要删除),而在更复杂的应用程序中,我看到这只会导致窗口内容的部分重绘。

我尝试注册NSPersistentStoreDidImportUbiquitousContentChangesNotification,但在任何一个平台上都不会出现此通知。

在 OS X 上是否有任何方法可以通知来自 iCloud 的更改,以便可以对 UI 进行所需的更新,然后防止重新打开窗口?

【问题讨论】:

我为此提交了 DTS。如果我得到一个可以分享的答案,我会添加一个答案,这样其他人就不必提交 DTS。 【参考方案1】:

Mike 从您的描述中不清楚您是使用 iCloud 同步事务日志还是将整个文档放在 iCloud 中并同步文档。如果您使用事务日志来同步文档,则不清楚“禁用编辑”通知是什么 - 这对事务日志同步没有用处。对于后者,您必须使用 NSPersistentStoreUbiquityNameKey 选项集打开存储,这将导致 Core Data 在 iCloud 中创建事务日志并从其他设备导入日志。然后您应该会收到导入通知。

快速检查 iCloud 容器应该可以确认您使用的是哪种方法。如果您使用的是事务日志,那么 iCloud 容器应该如下所示:

您可能想查看下面的链接,我在该链接中发布了一些有关如何创建基于文档的应用程序的更详细说明。 http://ossh.com.au/design-and-technology/software-development/。

不幸的是,示例应用程序并非基于 UIManagedDocument 或 NSPersistentDocument,但如果您查看它们处理备份文件的方式,您可能会使用该方法创建基于文档的应用程序,而不是使用 UIManagedDocument。

此外,您还可以使用他们用来获取同步更新通知的相同方法,然后更新 UI。两者都广泛使用了NSPersistentStoreDidImportUbiquitousContentChangesNotification 导入通知,您似乎无法合并更改并将消息发送到 UI 视图以进行自我更新。

【讨论】:

我在NSFilePresenter 协议中找到了presentedItemDidChange 方法,该方法告诉我文档何时在磁盘上发生更改,如果我在不调用 super 的情况下拦截它,则窗口不会重新打开。我敢肯定,如果我坚持这条路线,我将不得不重复自己的许多其他行为。我会看看你的链接,看看是否有更好的想法可以从那里合并。最大的问题是文档存在于 /Documents 中,因此用户可以在应用程序之外单独删除它们。

以上是关于在重新加载文档之前,如何在 OS X 上的 iCloud 中检测对 Core Data 文档的更改?的主要内容,如果未能解决你的问题,请参考以下文章

在 OS X 上的 IntelliJ 中,如何清除所有全局设置信息、许可等(任何项目外部)

界面生成器:10.7 之前的 Mac OS X 版本上的属性不可用标识符

使用 os.execl() 重新加载时没有名为“x”的模块

PHP Mac OS X上的PHP系统加载

如何在Mac OS X上将PDF转换为Microsoft Word

Mac OS X上的PHP系统加载