ios - WatchKit 核心数据同步

标签 ios core-data synchronization watchkit

我有一个结构如下的应用

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/

相关文章:

iOS8 - 模拟器 - 如何模拟位置

ios - 无法从 coredata 实体 swift 中删除对象

ios - 关于核心数据库设计

cocoa - 拖放而不实现 tableView :objectValueForTableColumn:row: and numberOfRowsInTableView:

java - 具有同步和非同步块(synchronized block)执行的程序

java - 这些方法是线程安全的吗?

ios - 选择器 View 的替代方案

ios - 来自 PHImageManager 的图像数据不同于保存为 Assets 的图像数据

file - 如果 rsync 正在备份的文件在此过程中被更新,它会如何表现?

ios - 如何创建带有部分和分组单元格的自定义 UITableView?