Ios iCloud&x2B;核心数据:首次导入和用户';s的数据丢失感
我已经实现了一个iPhone应用程序,拥有大约5万用户。从iOS7切换到iOS8许多这样的用户在认为自己的数据丢失时都有一种可怕的感觉 我已经实现了我认为是苹果公司建议的第一个导入行为 1)用户启动应用程序 2)iCloud,自动开始同步以前存储在iCloud上的数据 3)在某个时刻,由于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)在某一点上: 需要同步
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文件夹,则不会进行同步。只需