iCloud、核心数据和iOS 7中web服务的数据
我正在编写一个非常简单的应用程序,用于跟踪、存储和组织从iTunes和Rottentomotos下载的电影。我把电影放在一个大的后面,通常一次大约150部电影。然后,用户可以查看提要并将电影添加到自定义列表中 我遇到的问题是从网络上提取数据,并与iCloud同步,生成电影的副本 我一直在考虑将电影提要拆分为本地存储(从iCloud中删除),然后在单独的iCloud核心数据存储中创建列表和其他用户值,甚至使用iCloud键值存储(尽管保存电影列表可能很困难) 这是我第一个使用iCloud的应用程序,所以我使用的是来自的一些样板文件。我做了一些修改,因为我的web同步使用后台NSManagedObjectContext来完成工作。后台MOC保存,然后我的主MOC合并中的更改。UI主要是NSFetchedResultsController,因此整个系统可以无缝工作 下面是一些处理iCloud通知的代码iCloud、核心数据和iOS 7中web服务的数据,ios,objective-c,core-data,icloud,core-data-migration,Ios,Objective C,Core Data,Icloud,Core Data Migration,我正在编写一个非常简单的应用程序,用于跟踪、存储和组织从iTunes和Rottentomotos下载的电影。我把电影放在一个大的后面,通常一次大约150部电影。然后,用户可以查看提要并将电影添加到自定义列表中 我遇到的问题是从网络上提取数据,并与iCloud同步,生成电影的副本 我一直在考虑将电影提要拆分为本地存储(从iCloud中删除),然后在单独的iCloud核心数据存储中创建列表和其他用户值,甚至使用iCloud键值存储(尽管保存电影列表可能很困难) 这是我第一个使用iCloud的应用程序
// 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完成合并更改后,我可以添加一些逻辑,但这看起来不太可靠,因为我可能会在设备之间的更改循环中结束
有没有想过如何才能做到这一点?我相信人们以前都这么做过,我只是找不到任何有用的资源。如果我正确理解您的情况,用户可能会同时在两台不同的设备上下载同一部电影,同步后,您就有了电影的副本 对于这种情况,苹果的建议只是在任何iCloud合并后进行重复数据消除。您执行提取以查找具有相同电影id的对象,并以确定的方式对重复项进行排序,然后删除一个。如果不对它们进行排序,则可能会删除一个设备上的一个对象,并删除另一个设备上的另一个对象,最终没有对象 本文提供了查找副本的有效代码:
如果您不喜欢整个合并后重复数据消除过程,那么像和这样的框架允许您提供全局ID,从而消除重复数据消除的必要性。(披露:我开发了集成)因此,通过排序,这是否可以避免任何类型的“删除周期”,即一台设备删除dup a,另一台设备删除dup b,它们同步a和b,然后重复?理论上,两个设备都会删除dup a?是的。他们的想法是,他们都应该删除相同的东西。如果发生这种情况,就不应该有任何乒乓球或数据丢失。