使用仅限iOS 7的应用程序处理核心数据和iCloud的正确方法
我有一个简单的基于使用仅限iOS 7的应用程序处理核心数据和iCloud的正确方法,ios,uitableview,core-data,icloud,Ios,Uitableview,Core Data,Icloud,我有一个简单的基于核心数据的应用程序,它是一个UITableView,由用户填充一些UITextFields,UITableView通过NSFetchedResultsController更新 作为一款仅限iOS 7的应用程序,目前在应用商店中没有启用iCloud,它运行得非常好。然而,现在是引入iCloud的时候了 我花了很长时间阅读iCloud和核心数据的iOS 7细节,包括2013年与此主题相关的WWDC视频。我还阅读了关于更简单方法的优秀页面。我已经阅读了这篇优秀的文章并遵循了Git代码
核心数据的应用程序,它是一个UITableView
,由用户填充一些UITextFields
,UITableView通过NSFetchedResultsController
更新
作为一款仅限iOS 7的应用程序,目前在应用商店中没有启用iCloud
,它运行得非常好。然而,现在是引入iCloud的时候了
我花了很长时间阅读iCloud和核心数据的iOS 7细节,包括2013年与此主题相关的WWDC视频。我还阅读了关于更简单方法的优秀页面。我已经阅读了这篇优秀的文章并遵循了Git代码,但我感到困惑
问题
我现在的问题不是问题;这是开始的地方。不幸的是,尽管所有的帖子都很好,但它们并不适合这个领域的新手
我有几个问题,这些问题甚至让我无法开始完整地引用:
1) 他粘贴在那里的带有通知和iCloud支持pragma标记的代码,我是否将这两者都放在应用程序代理中
2) 在注释说明的地方,在对-addPersistentStore
的调用中使用这些选项。我该怎么办?我可以看到,这是从persistentStoreCoorindator调用的,但是对于简单的同步,我应该在其中添加哪些确切的选项呢
3) iCloudPersistentStoreOptions
方法从何处调用
4) 我是否必须更改ManagedObjectContext
方法或PersistentStoreCoordinator
方法中的任何内容
5) 我是否必须有一个刷新UI的通知UITableView
我读了很多关于iOS 5和iOS 6的文章,我想要的是:
启用iCloud后,数据更新到新版本的应用程序会将信息上载到iCloud和具有相同iCloud帐户的其他设备,并下载该数据
更新
昨天我花了一些时间来弄清楚这一点,我想我已经快到了。在再次观看WWDC视频后,我在前面找到了问题1、2和3的答案,但我遇到了一个问题,即我的应用程序的应用商店版本(没有iCloud)有一些数据,当我使用iCloud上传到新的开发版本时,我的所有数据都没有出现在UI中(尽管它确实存在于核心数据中,因为我在设备的设置中看到了核心数据备份)
我通过以下persistentStoreCoordinator代码实现了这一点:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Planner.sqlite"];
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *url = [fm URLForUbiquityContainerIdentifier:nil];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES,
NSPersistentStoreUbiquitousContentNameKey : @"Planner"
};
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
不过,我仍停留在上面的问题4和5上。我是否必须更改persistentStoreCoordinator中的任何其他内容,以及我是否必须更改NSManagedObjectContext中的任何内容?最后,问题5-我是否必须更改实际TableView中的通知,因为数据没有显示,并且我怀疑它当前只是没有更新它用户界面
对于这个问题的任何指导都将不胜感激
您需要在上下文上设置一个mergePolicy
您需要确保已实现用于插入/删除/移动行的NSFetchedResultsController
委托方法
当您收到NSPersistentStoreDidImportUbiquitousContentChangesNotification
通知时,需要调用上下文队列上的mergeChangesFromContextDidSaveNotification:
方法(例如,如果您使用主线程上下文,则调用主队列)
非常感谢@Drew的回复。我很高兴地说,在你的回答中,我已经确定了第2个问题(在尝试iCloud同步之前,该应用程序运行得非常好,包括使用NSFRC删除)接下来我也做了第3项。这很好。但是我不确定我应该在哪里做第1项。合并策略是在managedObjectContext中完成的,还是作为特定通知的一部分?只要在初始化上下文时设置一个合并策略。这只是MOC的一个属性。非常感谢Drew-这样做了,现在它就可以工作了非常有魅力!我还有一些其他问题,但我将尝试解决这些问题。再次感谢您的帮助!您可能会发现此示例应用程序很有用