我有一个结构如下的应用
iOS 应用程序将数据写入核心数据,核心数据具有存储在共享应用程序组中的持久存储。
Watch Kit 扩展能够从 iOS 应用程序写入的核心数据中读取数据。
我遇到的问题是,如果我的 iOS 应用程序在我的 watch 套件应用程序打开时写入数据,我将无法获得更新,因为对象上下文未与磁盘上的数据同步。
有没有一种方法可以让我的 watch 套件扩展只读取数据以刷新上下文并强制它从磁盘上的数据再次加载?
最佳答案
我的工作解决方案是使用 MMWormhole从 iPhone 应用程序向我的 watch 应用程序发送通知 (NSManagedObjectContextDidSaveNotification
)。在 watch 应用程序的 Controller 中,我使用了 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 更新的所有其他工作。
您必须为您的 NSManagedObject 子类实现 NSCoding 协议(protocol)中的 initWithCoder:
和 encodeWithCoder:
方法,因为 MMWormhole 使用 NSKeyedArchiver 作为序列化媒介。
- (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"];
}
关于ios - WatchKit 核心数据同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27791594/