【问题标题】:The Right Way to do Core Data and iCloud with iOS 7 Only Apps使用仅限 iOS 7 的应用程序处理 Core Data 和 iCloud 的正确方法
【发布时间】:2014-06-29 01:38:51
【问题描述】:

我有一个简单的基于Core-Data 的应用程序,它是由用户填写一些UITextFields 填充的UITableView,UITableView 通过NSFetchedResultsController 得到更新。

作为一个仅适用于 iOS 7 的应用程序,并且现在在 App Store 中没有启用iCloud,它运行得非常好。然而,是时候介绍 iCloud 了。

我花了很长时间阅读有关 iCloud 和 Core Data 的 iOS 7 细节,包括 2013 年与该主题相关的 WWDC 视频。我还参考了更简单的方法阅读了出色的http://www.objc.io/issue-10/icloud-core-data.html 页面。我已经阅读了这篇出色的帖子 CoreData and iCloud 并遵循了 Git 代码,但我很困惑。

问题

我现在的问题不是问题;这是开始的地方。不幸的是,尽管所有帖子都很好,但它们并不适合该领域的新手。

我有几个问题让我无法从完整的参考开始:http://www.objc.io/issue-10/icloud-core-data.html

1) 他与通知和 iCloud Support 编译标记一起粘贴在那里的代码,我是否将它们都放在 App Delegate 中?

2) 在注释说明的情况下,请在调用 -addPersistentStore 时使用这些选项。我该怎么办?我可以看到它是从persistentStoreCoorindator 调用的,但是我在其中放置了哪些确切的选项以进行简单的同步?

3) iCloudPersistentStoreOptions 方法是从哪里调用的?

4) 我是否必须更改 ManagedObjectContext 方法或 PersistentStoreCoordinator 方法中的任何内容?

5) 我是否需要通知UITableView 来刷新 UI?

我已经阅读了很多关于 iOS 5 和 iOS 6 的文章,我想要的是:

应用程序将数据更新到启用 iCloud 的新版本,将信息上传到 iCloud 和具有相同 iCloud 帐户的其他设备,下载该数据。

更新

我昨天花了一些时间解决这个问题,我想我快到了。再次观看 WWDC 视频后,我已经找到了问题 1、2 和 3 的答案,但是我遇到了一个问题,即我的应用程序的 App Store 版本(没有 iCloud)有一些数据,当我上传到新的使用 iCloud 进行开发构建,我的所有数据都没有出现在 UI 中(尽管它确实存在于 Core Data 中,因为我在设备的设置中看到了核心数据备份)。

我使用以下 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 中的通知,因为数据没有显示,我怀疑它目前只是没有更新它的 UI..

对于这个问题的任何指导将不胜感激。

【问题讨论】:

标签: ios uitableview core-data icloud


【解决方案1】:
  1. 您需要在上下文中设置mergePolicy
  2. 您需要确保已实现 NSFetchedResultsController 委托方法来插入/删除/移动行。
  3. 当您收到NSPersistentStoreDidImportUbiquitousContentChangesNotification 通知时,您需要在您的上下文队列(例如主队列,如果您使用主线程上下文)上调用mergeChangesFromContextDidSaveNotification: 方法。

【讨论】:

  • 非常感谢@Drew 的回复。我很高兴地说,在您的回答中,我肯定完成了第 2 项(该应用程序在尝试 iCloud 同步之前完美运行,包括使用 NSFRC 删除)并遵循objc.io/issue-10/icloud-core-data.html 我现在也完成了第 3 项。这都很好。但是我不太确定我会在哪里做 1。mergePolicy 是在 managedObjectContext 中完成,还是作为特定通知的一部分?
  • 在初始化上下文时设置一个合并策略。这只是 MOC 的财产。
  • 非常感谢 Drew - 它做到了,现在它就像一个魅力!我还有其他一些问题,但我会尝试解决这些问题。再次感谢您对此的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-08-31
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2015-04-04
  • 2014-04-15
相关资源
最近更新 更多