4

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

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

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

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

有没有一种方法,因为我的手表套件扩展只读取数据才能刷新上下文并强制它从磁盘上的数据再次加载?

4

3 回答 3

2

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

// 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 协议中的方法,因为 MMWormhole 使用 NSKeyedArchiver 作为序列化介质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"];
}
于 2015-04-06T16:30:18.037 回答
1

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

于 2015-01-06T16:59:37.700 回答
1

遇到类似的问题。尽管在 App Group 中创建了一个共享的 Fetched Results Controller 来观察托管对象上下文的变化并刷新托管对象上下文是不可行的。

托管对象上下文缓存一定级别的对象图以供检索,而无需从磁盘上的实际 SQLite 存储中读取。真正实现两者之间实时同步的唯一潜在方法是在 MOC 更改时通过 iOS 应用程序向 Extension 发送消息,并且每次都从磁盘销毁/重建 Core Data 堆栈,这根本不是一个好的解决方案。

我相信在初始启动时在 iOS 和 Extension 之间进行实时同步的用例不是必需的。希望我们在未来的版本中能更深入地解决这个问题。

于 2015-01-29T13:08:56.803 回答