WatchKit 和 App 之间的 Core Data 实时同步
Posted
技术标签:
【中文标题】WatchKit 和 App 之间的 Core Data 实时同步【英文标题】:Real time sync of Core Data between WatchKit and the app 【发布时间】:2015-03-25 20:30:24 【问题描述】:我正在为 iPhone 应用程序编写 WatchKit 扩展。我使用 App Groups 共享核心数据。这是有效的,数据是共享的。现在,如果应用程序在前台运行并且新的数据库条目从手表添加到数据库,我想刷新 iPhone 应用程序内的数据。跟踪我订阅了NSManagedObjectContextDidSaveNotification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:nil];
合并方法:
- (void)mergeChanges:(NSNotification *)notification
if(notification.object != self.managedObjectContext)
[self performSelectorOnMainThread:@selector(updateMainContext:) withObject:notification waitUntilDone:NO];
更新主上下文方法:
- (void)updateMainContext:(NSNotification *)notification
assert([NSThread isMainThread]);
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
我试图在模拟器上测试它(通过同时运行 iPhone 和 Watch 模拟器),但不幸的是 NSManagedObjectContextDidSaveNotification
没有被调用。
真的可以在模拟器上测试吗?如果是,这是正确的方法吗?
【问题讨论】:
【参考方案1】:您不能使用 NSNotificationCenter,因为 ios 应用程序和扩展程序是不同的进程。查看使用 MMWormhole 在进程之间发布您自己的通知。您可以在您的扩展程序和 iOS 应用程序中收听NSManagedObjectContextDidSaveNotification
,然后使用 MMWormhole 让其他进程知道该通知。此外,您需要手动刷新托管数据对象(请参阅[NSManagedObjectContext refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag]
)。
【讨论】:
感谢您的帮助。我的印象是,如果应用程序和手表使用相同的 NSPersistentStore(sqlite 文件),那么我将能够跟踪其中的更改。我错了吗?我认为这类似于在不同线程上处理多个上下文。 因为 WatchKit 扩展程序和 iOS 应用程序运行在不同的进程中,所以它们不会相互通信。当您有两个线程在同一个进程中运行时,它们可以相互通信。所以你必须管理沟通。我将它添加到我的 WatchKit 扩展中,它不需要太多额外的工作。 实际上我很确定这应该有效。您可以使用通知中心来收听 WatchKit 扩展中的内容,而他正在尝试收听的是从 WatchKit 应用程序中设置的 NSManagedObjectContext,该应用程序附加到使用应用程序组在应用程序之间共享的持久存储.或者我在这里错过了什么?我的 watchkit 应用使用 NSFetchedResultsController 监听共享数据库更改。 我以为他试图在他的 WatchKit 扩展中监听对 iOS 应用程序中持久性存储所做的更改。是的,您可以让您的扩展程序监听扩展程序中所做的更改。 嗯,但我想我的意思是这样的:假设您有一个在电话和分机之间共享的持久存储,并且您的分机上设置了一个 CoreData 堆栈,该堆栈连接到该堆栈持久存储。现在你的 iPhone 对这个存储进行了更改,你的手表扩展上的 CoreData 堆栈应该对它们做出反应,对吧?以上是关于WatchKit 和 App 之间的 Core Data 实时同步的主要内容,如果未能解决你的问题,请参考以下文章
WatchKit App 仅返回一些 HealthKit 数据
Watchkit , openParentApplication 和 WatchKit 扩展