WatchKit 和 iOS 应用程序的核心数据

Core Data with WatchKit and iOS App

这个问题已经有人问过,但是收到了

我的 iOS 应用程序和我的 WatchKit 扩展程序共享一个应用程序组,其中保留了核心数据存储。 Core Data 模型(简化)是一个具有 Age 属性的 Person 对象。 App和扩展都可以随意更改年龄。

如果某个人的值在手表上发生变化,除非我关闭并重新运行该应用程序,否则该应用程序不会反映出来。同向反方向

如果我尝试将手表上的年龄更改为 20,并将 phone 上的年龄更改为 30,那么我会收到与合并冲突有关的错误,因为我没有使用其中一台设备上的 NSManagedObject 的最新版本(以我最后一次更改年龄为准)。

我怎样才能让两者毫无问题地协同工作?

发生这种情况是因为您正在使用无法通过通知进行通信的不同托管对象上下文。所以 post 发出像 NSManagedObjectContextObjectsDidChangeNotification 这样的通知是行不通的,因为 NSNotificationCenter 不会 post 从你的 iOS 应用到扩展的通知,因为它们是不同的进程 运行在不同的内存空间。我 运行 在我的应用程序中使用同样的东西。您需要在使用前刷新该对象。基本上,您正在执行手动故障。对于性能,您可能需要某种方式来了解何时执行此操作以及何时不执行此操作。您可以通过将对象传递给 [NSManagedObjectContext refreshObject: mergeChanges:].

来刷新对象

由于不会在不同进程之间获取通知,因此您需要改用 Darwin 通知。您可以轻松地使用 openParentApplication:reply: 方法将更新从 Watch Extension 发送到 iOS App,但 Apple 没有办法将事件从 iOS App 发送到 Watch Extension。

我建议您使用 MMWormhole (or you own implementation of Darwin notifications) to send a Darwin notification when the Core Data object has been updated. Here 一篇详细介绍库工作原理的文章。

如果您在 Watch Extension 中更新核心数据对象,则向 iOS 应用程序发送 Darwin 通知(或传递消息),告诉应用程序它需要刷新核心数据对象。同样的方法可以用于另一个方向,从 iOS App 到 Watch Extension。

此外,如果您的对象真的很简单,那么 CoreData 可能就有点矫枉过正了。您可以使用 MMWormhole 来简单地缓存在两端使用的轻量级字典。我已经使用这种方法几个星期了,它在两个方向上都完美无缺。