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

时间:2014-02-24 01:16:55

标签: ios objective-c core-data icloud

我正在尝试在本地商店更改为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中实现更新ui应该做的事情。但不知何故,这似乎是我打算做的。

修改 通过接受答案中的相关帖子,我可以解决我的问题

我在

中检查用户指示通知

像这样: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 个答案:

答案 0 :(得分:3)

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

问题是你不知道情况发生之前是什么情况除非你知道你正在创建一个新商店并且商店已经存在于iCloud中。

遗憾的是,在我的解释中指出,本地存储和iCloud存储之间没有真正的切换 - 但是Core Data会以某种方式导入sideLoad存储,此时您将获得转换类型4通知(第二个storesDidChange)。

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

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/