WatchKit核心数据同步了

我有一个应用程序结构如下

iOS应用程序将数据写入具有存储在共享应用程序组中的持久性存储的核心数据。

Watch Kit扩展程序能够从iOS应用程序编写的Core Data中读取数据。

我遇到的问题是如果我的iOS应用程序写数据,而我的手表套件应用程序打开我没有得到更新,因为对象上下文不与磁盘上的数据同步。

有没有办法,因为我的手表套件扩展只读数据,能够刷新上下文,并迫使它再次从磁盘上的数据加载?

我的工作解决scheme是使用MMWormhole从iPhone应用程序发送通知( NSManagedObjectContextDidSaveNotification )到我的手表应用程序。 在手表应用程序的控制器中,我使用了NSManagedObjectContext的mergeChangesFromContextDidSaveNotification:方法。

 // in iPhone app's notification handler MMWormhole *wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:@"your.group.container.identifier" optionalDirectory:nil]; [wormhole passMessageObject:notification identifier:@"your notification identifier"]; // in WKInterfaceController's awakeWithContext: method MMWormhole *wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:@"your.group.container.identifier" optionalDirectory:nil]; [wormhole listenForMessageWithIdentifier:@"your notification identifier" listener:^(id messageObject) { [self.managedObjectContext mergeChangesFromContextDidSaveNotification:messageObject]; }]; 

然后,NSFetchedResultsController做了所有其他UI更新的工作。

因为MMWormhole使用NSKeyedArchiver作为序列化介质,所以必须为NSManagedObject子类实现NSCoding协议的initWithCoder:encodeWithCoder:方法。

 - (id)initWithCoder:(NSCoder *)decoder { NSManagedObjectContext *context = ... // use your NSManagedObjectContext NSPersistentStoreCoordinator *coordinator = ...; //use your NSPersistentStoreCoordinator NSURL *url = (NSURL *)[decoder decodeObjectForKey:@"URIRepresentation"]; NSManagedObjectID *managedObjectID = [coordinator managedObjectIDForURIRepresentation:url]; self = [context existingObjectWithID:managedObjectID error:nil]; return self; } - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:[[self objectID] URIRepresentation] forKey:@"URIRepresentation"]; } 

我遇到了同样的问题。 我在- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag使用- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag来获取pipe理对象的最新数据。

跑到类似的问题。 尽pipe在应用程序组中创build了一个共享Fetched Results Controller,但是观察受pipe对象上下文更改和刷新受pipe对象上下文并不可行。

托pipe对象上下文caching一定级别的对象graphics以供检索,而不从磁盘上的实际SQLite存储中读取。 实际上在两者之间进行实时同步的唯一潜在方法是,当MOC发生变化时,通过iOS应用将消息发送到扩展,并且每次都从磁盘上销毁/重新构build核心数据堆栈,而不是一个很好的解决scheme。

我相信iOS和Extension在首次启动时进行实时同步的用例并不是必需的。 希望在未来的版本中,我们可以更深入地解决这个问题。