【发布时间】:2014-04-04 13:14:26
【问题描述】:
我正在编写一个非常简单的应用程序,用于跟踪、存储和组织来自 iTunes 和 RottenTomatoes 的电影。我把电影放在一个大的后面,通常一次大约 150 部电影。然后,用户可以查看提要并将电影添加到自定义列表中。
我遇到的问题是从网络中提取数据并与 iCloud 同步,从而产生电影的副本。
我一直在考虑将电影提要放入本地存储(从 iCloud 中删除),然后在单独的 iCloud 核心数据存储中创建列表和其他用户值,甚至使用 iCloud 键值存储(尽管保存电影列表可能会很粗糙)。
这是我第一个使用 iCloud 的应用程序,所以我使用了来自 this objc.io article 的一些样板文件。我做了一些修改,因为我的网络同步使用后台 NSManagedObjectContext 来完成这项工作。后台 MOC 保存,然后我的主 MOC 合并更改。UI 主要是 NSFetchedResultsControllers,因此整个系统可以无缝运行。
这里是一些处理 iCloud NSNotifications 的代码
// happens when the main MOC saves
- (void)managedObjectContextDidSaveNotification:(NSNotification *)notification {
@synchronized(self) {
NSManagedObjectContext *moc = self.backgroundManagedObjectContext;
[moc performBlock:^{
[moc mergeChangesFromContextDidSaveNotification:notification];
}];
}
}
// happens when the bg MOC saves
- (void)backgroundManagedObjectContextDidSaveNotification:(NSNotification *)notification {
@synchronized(self) {
NSManagedObjectContext *moc = self.managedObjectContext;
[moc performBlock:^{
[moc mergeChangesFromContextDidSaveNotification:notification];
}];
}
}
- (void)persistentStoreDidImportUbiquitousContentChanges:(NSNotification *)notification {
@synchronized(self) {
NSManagedObjectContext *moc = self.managedObjectContext;
[moc performBlock:^{
[moc mergeChangesFromContextDidSaveNotification:notification];
}];
}
}
- (void)storesWillChange:(NSNotification *)notification {
NSManagedObjectContext *moc = self.managedObjectContext;
[moc performBlockAndWait:^{
NSError *error = nil;
if ([moc hasChanges] && [moc save:&error]) {
DDLogInfo(@"MOC saved succesfully");
}
else {
DDLogError(@"Error saving MOC: %@",error);
}
}];
}
- (void)storesDidChange:(NSNotification *)notification {}
我原本以为在 iCloud 完成合并更改后我可以添加一些逻辑,但这看起来不太可靠,因为我可能最终陷入设备之间的更改循环。
对如何实现这一点有任何想法吗?我敢肯定人们之前已经这样做过,我只是找不到任何有用的资源。
【问题讨论】:
标签: ios objective-c core-data icloud core-data-migration