当用户在应用程序设置bundle中启用或禁用iCloud支持时该怎么办



我的目标是iOS7,我使用带有UIManagedDocumentiCloud。我想知道在这两种情况下该怎么办:

1) 第一种情况:应用程序首次启动

这是第一次发布,当时我们还不知道用户是否想使用iCloud,我们应该假设他不想使用,直到我们问他。一旦我们发现,他的选择将存储在应用程序设置捆绑包中,他稍后可以改变主意。

当我的应用程序启动时,出现的第一个视图会触发带有[[UIManagedDocument alloc] initWithFileURL:url]的UIManagedDocument init。它这样做是因为它应该知道它必须在表中显示多少行。

目前,这是第一次启动,我仍然需要向用户询问,我认为他不想使用iCloud,因此UIManagedDocument在没有设置persistentStoreOptionsNSPersistentStoreUbiquitousContentNameKeyNSPersistentStoreUbiquitousContentURLKey)的情况下进行初始化。

然后使用在磁盘上创建文件

[UIManagedDocument saveToURL: URL 
            forSaveOperation: UIDocumentSaveForCreating 
           completionHandler: ^(BOOL success){
            if(success){
              //Do something with the document
            }
           }];

然后出现该视图。由于这是第一次发布,我应该问用户是否想使用iCloud。

我显示来自[viewDidAppear:animated]UIAlertView

如果他回答"",一切都已经好了。但如果他说""该怎么办??

我应该关闭UIManagedDocument并迁移数据库吗?还是在文档的persistentStoreOptions中设置NSPersistentStoreUbiquitousContentNameKeyNSPersistentStoreUbiquitousContentURLKey就足够了?

2) 第二种情况:几天后用户改变主意

用户确实选择启用iCloud,但过了一天他改变了主意。他在应用程序设置捆绑包中切换到"否"iCloud选项。当应用程序启动时,我检查这个选项是否有变化,我发现它已经从YES切换到NO。正如我在SO上得到的提示所理解的,正确的路径应该是显示UIAlertView,询问他是否想要:

a) 将文档保存在设备上

b) 从设备中删除文档

c) 继续使用iCloud

对于选项a)和b),我应该怎么做?选项A)的数据库迁移,选项b)从零重新创建数据库?

使用术语"迁移"的方式有点令人困惑,因为将核心数据模型从一个版本递增到一个新版本也被称为迁移。我想你只是在谈论从iCloud"迁移"到仅本地,反之亦然。

在您的第一种情况下,在用户做出选择之前,我不会创建UIManagedDocument。如果用户想使用iCloud,你所要做的就是打开它,你不必担心关闭/删除本地文档(现在这毫无意义)。

在第二种情况下,如果用户选择选项A,则将文件从iCloud复制到本地,然后将其从iCloud中删除。选项B的意思是"从iCloud中删除,我不想要它了"。如果您仍然想在本地继续使用核心数据,请为其创建一个新文档。当然,C不会做任何事情,只需解除警报即可。

通常有两个地方可以检查iCloud设置是否已更改和/或检查或打开任何文件:1) 在AppDelegate方法应用程序中:didfinishlaunchingwithoptions,和2) 在AppDelegate方法应用程序中将进入前台

此外,如果您注册了iCloud帐户更改通知,则可以对其进行响应。

这允许您在视图开始尝试显示任何核心数据项之前组织事情。打开或迁移文件可能需要一些时间,因此在执行此操作时,您可能必须显示其他活动指示器视图。

我不会在显示数据的视图中创建文档,因为打开文档的调用是异步执行的,在完成处理程序运行之前,您不知道它何时完成。相反,您应该使用完成处理程序来启动此视图,因为这样您就知道开始访问核心数据对象是安全的。

关于如何实现UIManagedDocument&iCloud集成在此。