使用仅限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-这样做了,现在它就可以工作了非常有魅力!我还有一些其他问题,但我将尝试解决这些问题。再次感谢您的帮助!您可能会发现此示例应用程序很有用