Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iCloud&x2B;核心数据:首次导入和用户';s的数据丢失感_Ios_Core Data_Architecture_Synchronization_Icloud - Fatal编程技术网

Ios iCloud&x2B;核心数据:首次导入和用户';s的数据丢失感

Ios iCloud&x2B;核心数据:首次导入和用户';s的数据丢失感,ios,core-data,architecture,synchronization,icloud,Ios,Core Data,Architecture,Synchronization,Icloud,我已经实现了一个iPhone应用程序,拥有大约5万用户。从iOS7切换到iOS8许多这样的用户在认为自己的数据丢失时都有一种可怕的感觉 我已经实现了我认为是苹果公司建议的第一个导入行为 1)用户启动应用程序 2)iCloud,自动开始同步以前存储在iCloud上的数据 3)在某个时刻,由于nsPersistentStoreUbiquiousTransitionTypeInitialImportCompleted,用户会收到来自iCloud的数据已准备就绪的通知 问题在于3)在某一点上: 需要同步

我已经实现了一个iPhone应用程序,拥有大约5万用户。从iOS7切换到iOS8许多这样的用户在认为自己的数据丢失时都有一种可怕的感觉

我已经实现了我认为是苹果公司建议的第一个导入行为

1)用户启动应用程序

2)iCloud,自动开始同步以前存储在iCloud上的数据

3)在某个时刻,由于
nsPersistentStoreUbiquiousTransitionTypeInitialImportCompleted,用户会收到来自iCloud的数据已准备就绪的通知

问题在于3)在某一点上
需要同步大量数据的用户需要几分钟才能完成同步,同时他们认为自己的数据丢失了

我真的不知道如何让我的用户知道他们必须等待数据同步,因为我不知道这个操作何时开始


我正在考虑一个可能的解决方案:

在应用程序首次启动时,询问用户是否想使用iCloud。如果他选择使用它,用iCloud选项构建数据库,这样我就确切地知道同步从这里开始(我想…) 我真的不确定如何实现这种行为,因为我总是在
AppDelegate
中看到核心数据设置,但要实现这种行为,我想我需要在控制器中移动所有的核心数据设置


你觉得这个解决方案怎么样?您是如何在应用程序中解决此问题的

你的想法是对的,至少我们是这么做的。但是把它放在appDelegate中

在执行“addPersistentStoreWithType”时,区分使用iCloud和不使用iCloud。如果您使用iCloud选项,它将直接开始构建本地商店,这是一种占位符(我相信您知道这一点,但只是为了澄清我的想法)。一旦完成,同步将从iCloud开始。这就是我理解你在寻找的起点

您可以使用NSPersistentStoreCoordinatorsStoresIDChangeNotification发出的通知来监视该过程,并相应地通知用户该通知已触发


如果您查看文档中的“对iCloud事件的反应”,其中有一个详细的描述。

要总结的是,您描述的事件是帐户转换过程的一部分。触发以下四个事件之一时,将发生帐户转换:

  • 初始导入
  • 使用的iCloud帐户确实发生了变化
  • iCloud已禁用
  • 您的应用程序数据已被删除
在此事件期间,核心数据将发布
NSPersistentStoreCoordinatorsStoreswillChangeNotification
NSPersistentStoreCoordinatorsStoresIDChangeNotification
通知,让您知道正在发生帐户转换。我们感兴趣的转换类型是
nsPersistentStoreUbiquiousTransitionTypeInitialImportCompleted

为了简单起见,我将所有与核心数据相关的代码移到了自己的管理器中,并将其与单例设计模式结合使用。在设置singleton时,我向Manager注册所有相关通知(
NSPersistentStoredIDIMPORTUBITUBITUS内容更改通知
NSPersistentStoreCoordinatorsStoreswillChangeNotification
NSPersistentStoreCoordinatorsStoresIDChangeNotification
NSPersistentStoreCoordinator将撤销投资通知
)。 我在设置中存储了一些信息(
NSUserDefaults
或任何内容),如上次iCloud状态(启用、禁用、未知),初始导入是否完成,等等

我最后做的是提示(
UIAlertController
或其他任何东西)以确认用户是否要使用iCloud。我有一个
displayicCloudDialogandforce:completion:
方法来执行此操作,并且仅当iCloud状态设置未知或我使用force参数时才执行此操作

然后,在用户输入后,我调用
setupCoreDataWithICloud:
方法,
iCloud
布尔参数取决于用户的选择。然后,我将根据
iCloud
参数在云上或不在云上设置我的核心数据堆栈。 如果我使用iCloud进行设置,我会检查我的设置,以查看iCloud导入的键(布尔值)的值。如果该值为否,则我将显示一个新模式,以警告用户可能需要一些时间才能导入

我已经为不同的通知注册了我的经理,特别是
nsPersistentStoreCoordinatorsStoresIDChangeNotification
。在我的
StoredChange:
回调中,我正在检查转换类型,如果它是
nsPersistentStoreUbiquiousTransitionTypeInitialImportCompleted
,我正在将模式的内容更改为向用户显示导入成功,并在几秒钟后将其删除,在“我的设置”中保存初始导入已完成

- (void)storeDidChange:(NSNotification *)notification 
{
    NSPersistentStoreUbiquitousTransitionType transitionType = [notification.userInfo[NSPersistentStoreUbiquitousTransitionTypeKey] integerValue];

    if (transitionType == NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted) {
        [settings setDefaults:@(YES) forKey:kSettingsICloudImportedKey];
        [ICloudModal dismissWithSuccess];

        // ...
    }

    // Do other relevant things...
}

要观看的正确事件是NSPersistentStoreCoordinatorsStoresIDChangeNotification谢谢!我不接受您的回答,因为在数据已经从iCloud下载时调用了“willChange”事件:(当未调用NpersistentStoreUbiquiousTransitionTypeInitialImportCompleted时,您在第一次启动时会做什么?您在第一次启动时会显示模式…但是如果用户没有在iCloud上存储数据,则不会调用initialImportComplete通知,因此不会显示模式。)closed@MatterGoal一种可能的处理方法是观察ubiquity容器。首先进行查询。如果存在iCloud文档(存在/coredata文件夹),则用户已将核心数据存储保存到其iCloud中。如果没有/coredata文件夹,则不会进行同步。只需