【问题标题】:iCloud & CoreData: Notification when changed to iCloud Store (First Launch with existing iCloud Data)iCloud 和 CoreData:更改为 iCloud Store 时的通知(使用现有 iCloud 数据首次启动)
【发布时间】: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];
    }

【问题讨论】:

    标签: ios objective-c core-data icloud


    【解决方案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/

    【讨论】:

    • 您的相关帖子对我帮助很大!我用我的解决方案更新了我的问题
    猜你喜欢
    • 2014-03-01
    • 2013-06-08
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2012-04-09
    • 2012-07-15
    相关资源
    最近更新 更多