iCloud 和 CoreData:更改为 iCloud Store 时的通知(使用现有 iCloud 数据首次启动)

Posted

技术标签:

【中文标题】iCloud 和 CoreData:更改为 iCloud Store 时的通知(使用现有 iCloud 数据首次启动)【英文标题】:iCloud & CoreData: Notification when changed to iCloud Store (First Launch with existing iCloud Data) 【发布时间】:2014-02-24 01:16:55 【问题描述】:

我正在尝试在本地存储更改为 iCloud 存储时接收消息。

这是一个关键事件。所以我的用例是一个新设备在从一个空商店开始后接收 iCloud 商店。我想通知视图更新接收到的内容。

我像这样初始化我的托管对象上下文:

[self.managedObjectContext.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                                   configuration:nil
                                                                             URL:self.storeURL
                                                                         options:@ NSPersistentStoreUbiquitousContentNameKey : @"iCloudStore", [NSNumber numberWithBool:YES]: NSMigratePersistentStoresAutomaticallyOption,
                                                                                    [NSNumber numberWithBool:YES]:NSInferMappingModelAutomaticallyOption
                                                                           error:&error];

我的下一步是收到以下通知:

NSNotificationCenter *dc = [NSNotificationCenter defaultCenter];
[dc addObserver:self
       selector:@selector(storesWillChange:)
           name:NSPersistentStoreCoordinatorStoresWillChangeNotification
         object:psc];

[dc addObserver:self
       selector:@selector(storesDidChange:)
           name:NSPersistentStoreCoordinatorStoresDidChangeNotification
         object:psc];

[dc addObserver:self
       selector:@selector(persistentStoreDidImportUbiquitousContentChanges:)
           name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
         object:psc];

我认为在name:NSPersistentStoreCoordinatorStoresDidChangeNotification 中实现更新用户界面应该可以做到这一点。但不知何故,这似乎是我打算做的。

编辑: 通过已接受答案中的相关帖子,我可以解决我的问题

我检查通知用户字典

像这样:storesDidChange:

NSNumber *storeVal = [note.userInfo objectForKey:NSPersistentStoreUbiquitousTransitionTypeKey];
    if (storeVal.integerValue == NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted) 
        //you are now in sync with iCloud
        NSLog(@"On iCloud Store now");
        [self.delegate storeHasChanged];
    

【问题讨论】:

【参考方案1】:

有关处理 Core Data 存储更改事件的说明,请参见下面的链接。请注意,无论您的商店处于何种状态,第一个 storesDidChange 通知都是相同的。但是,如果这是您第一次创建商店并且已经有一个 iCloud 商店,那么一旦现有的 iCloud 商店初始导入完成,您将收到另一个 storesDidChange 通知。

问题是您在情况发生之前不知道情况如何,除非您知道您正在创建一个新商店并且 iCloud 中已经存在一个商店。

遗憾的是,正如我的解释中所述,本地存储和 iCloud 存储之间没有真正的切换 - 但是 Core Data 确实以某种方式导入了 sideLoad 存储,此时您会收到转换类型 4 通知(第二个 storesDidChange)。

另外请注意,如果您的商店需要升级到新模型版本,您还会收到一大堆storesDidChange 通知...

http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/sample-apps-explanations/handling-icloud-account-transitions/

您可能还想在同一个链接中查看示例应用程序如何执行您尝试执行的操作 http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

【讨论】:

您的相关帖子对我帮助很大!我用我的解决方案更新了我的问题

以上是关于iCloud 和 CoreData:更改为 iCloud Store 时的通知(使用现有 iCloud 数据首次启动)的主要内容,如果未能解决你的问题,请参考以下文章

如何解决由于 iCloud 合并而导致的“CoreData:错误:严重的应用程序错误”?

iCloud - NSCoding 或核心数据

可以在 coredata 中存储 jpg 图像使 iCloud App 更容易

Core Data 应用程序中的 UITableView 不会更新第二个设备的主视图,除非重新启动应用程序,并使用 iCloud 同步

在使用 Ensembles 进行 CoreData 和 iCloud 同步之前,我是不是需要任何 iCloud 设置?

Coredata、NSOrderedSet 和 iCloud