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

这个问题已经被问到,但没有收到答案 。

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

如果某人的价值在手表上发生了变化,那么除非我closures并重新运行该应用程序,否则该应用程序不会反映该值。 同样走向相反的方向。

如果我尝试将手表的年龄更改为20岁,并将手机的年龄更改为30岁,那么我会遇到与合并冲突有关的错误,因为我没有使用最新版本的在其中一个设备上的NSManagedObject(无论我最后更改年龄)。

我怎样才能使这两个工作在一起没有任何问题?

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

我build议你使用MMWormhole (或者你自己的Darwin通知的实现)在核心数据对象更新的时候发送Darwin通知。 这是一篇详细介绍图书馆如何工作的文章。

如果更新了Watch扩展中的Core Data对象,则发送Darwin通知(或传递消息)给iOS应用程序,通知应用程序它需要刷新Core Data对象。 从iOS应用程序到Watch Extension,可以使用相同的方法。

另外,如果你的对象真的很简单,那么CoreData可能是过度的。 你可以使用MMWormhole来caching两端使用的轻量级字典。 我已经使用了这个方法几个星期了,它在两个方向上完美地工作。

发生这种情况是因为您正在使用不能通过通知进行通信的不同的托pipe对象上下文。 因此,发布像NSManagedObjectContextObjectsDidChangeNotification这样的通知将不起作用,因为NSNotificationCenter不会将通知从iOS应用程序发布到扩展,因为它们都是在不同内存空间中运行的不同进程。 我在我的应用程序中遇到了同样的事情。 在使用之前需要刷新对象。 基本上,你正在做一个手动故障。 为了performance,你可能需要某种方式知道什么时候该做什么,什么时候不做。 您可以通过将对象传递给[NSManagedObjectContext refreshObject: mergeChanges:]来刷新该对象。