Ios NSKeyedArchiver和iCloud

Ios NSKeyedArchiver和iCloud,ios,objective-c,icloud,nsarchiving,Ios,Objective C,Icloud,Nsarchiving,现在在我的应用程序中,我有一个顶级对象,它具有一个-(void)archive方法,该方法将自己归档到应用程序的文档目录中 我想知道是否可以通过更改文件路径将归档文件保存到iCloud而不是本地 我已经读了很多关于使用iCloud的书,但是我还没有看到这个问题得到解决。我猜这是不可能的,但我想确定一下 谢谢。您不应该将文件直接保存到iCloud,而应该将其保存在本地,然后将其移动到与应用程序关联的iCloud文件夹中 首先,您需要了解将文件保存到iCloud时应该使用哪个选项 然后,您只需检索要

现在在我的应用程序中,我有一个顶级对象,它具有一个
-(void)archive
方法,该方法将自己归档到应用程序的文档目录中

我想知道是否可以通过更改文件路径将归档文件保存到iCloud而不是本地

我已经读了很多关于使用iCloud的书,但是我还没有看到这个问题得到解决。我猜这是不可能的,但我想确定一下


谢谢。

您不应该将文件直接保存到iCloud,而应该将其保存在本地,然后将其移动到与应用程序关联的iCloud文件夹中

首先,您需要了解将文件保存到iCloud时应该使用哪个选项

然后,您只需检索要保存的文件的URL或路径。通过调用:
[[NSFileManager defaultManager]urlforubiquitycontainerinidentifier:@“myIdentifier”];
获取iCloud目录,然后附加适当的路径组件

最后,将文件(例如.myFile.dat)保存到一个临时本地文件夹中,如应用程序的文档目录,然后调用:
[[NSFileManager defaultManager]setUbiously:YES itemature:/*local URL*/destinationURL:/*Cloud URL*/error:&error];
这将把文件从本地文件夹移到iCloud文件夹,然后由操作系统的同步守护进程完成其余的工作

如果保存到iCloud documents目录,用户将通过iCloud drive看到您的文件。如果保存到其他iCloud目录,用户将无法看到该文件


注意:您需要使用来发现其他设备保存到iCloud的文件。此外,iOS设备不会自动下载您保存到iCloud的文件;您需要特别调用
[[NSFileManager defaultManager]StartDownloadingUbiquitousItemAttribute:url错误:&错误];
启动下载。OS X设备将自动下载iCloud文件。您可以使用该协议在应用程序的生命周期内监视iCloud目录的更改(检测其他设备保存的文件).

看到了好答案!OP还应该研究UIDocument类,它可以自动完成一些任务。这听起来不算太糟糕。我遇到了一个教程,它将顶级对象包装在UIDocument子类中,它们在视图控制器中处理加载/保存到iCloud的问题,但我觉得有一个n这样做的顶级对象,不必将代码复制到需要保存到iCloud的每个视图控制器。我的问题是:如果我要执行后者,是否仍然可以向每个视图控制器添加侦听器,以便在iCloud上的文件从另一个设备更改时更新我的顶级对象etition,我处理它的方式是创建一个单独的类(我的是单例)该类处理所有保存到iCloud文件夹并检测到其中的更改。然后,你可以从应用程序中的任何位置生成数据对象,并将其传递给singleton进行保存和上载;该类还可以发布通知,以便应用程序的不同部分可以响应iCloud文件夹中的更改。正如@Jef所说,UIDocument将为您自动化这些任务中的许多。但是,我更喜欢这种方法用于非基于文档的应用程序。因此,当显示不同的视图时,它们如何知道iCloud文件夹何时发生了更改?您说过,您的singleton实例会响应更改,所以我假设这意味着,一旦创建实例,它仍然会响应,而不管发生什么当前视图?基本上,我只想在“myObject”更改时刷新一些视图控制器,“myObject”当iCloud文件夹发生更改时,将发生更改。是的,请看,但类设计的本质是,一旦实例化,它将保持不变。然后,可以通知singleton对iCloud文件夹的更改,并将这些通知传递给应用程序的其他部分。你不应该到处制造数百个singleton它们对于指定特定工作和分离代码非常有用。良好的组织。