NSKeyedArchiver 和 iCloud
Posted
技术标签:
【中文标题】NSKeyedArchiver 和 iCloud【英文标题】:NSKeyedArchiver and iCloud 【发布时间】:2015-01-06 17:33:45 【问题描述】:现在,在我的应用程序中,我有一个带有 -(void)archive
方法的***对象,它将自己归档到应用程序的文档目录中。
我想知道是否可以通过更改文件路径将存档简单地保存到 iCloud 而不是本地。
我已经阅读了很多关于使用 iCloud 的文章,但我还没有看到这个问题得到解决。我猜这是不可能的,但我想确定一下。
谢谢。
【问题讨论】:
见***.com/questions/25353214/… 【参考方案1】:您不应将文件直接保存到 iCloud,而是将其保存在本地,然后将其移动到与您的应用关联的 iCloud 文件夹中。
首先您需要查看file coordination,您应该使用它来将文件保存到 iCloud。
然后您只需检索要保存的文件的 URL 或路径。您可以通过调用获取您的 iCloud 目录:[[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:@"myIdentifier"];
然后附加适当的路径组件。
最后,您将文件(例如 myFile.dat)保存到临时本地文件夹,如应用程序的文档目录,然后调用:[[NSFileManager defaultManager] setUbiquitous:YES itemAtURL:/*local URL*/ destinationURL:/*Cloud URL*/ error:&error];
这会将文件从本地文件夹移动到 iCloud 文件夹,然后操作系统同步守护进程完成其余的工作。
如果您保存到 iCloud 文档目录,您的文件将通过 iCloud 驱动器对用户可见。如果您保存到不同的 iCloud 目录,用户将无法看到该文件。
注意:您需要使用NSMetadataQuery 来发现其他设备保存到 iCloud 的文件。此外,ios 设备不会自动下载您保存到 iCloud 的文件;您需要专门致电[[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL:url error:&error];
来启动下载。 OS X 设备会自动下载 iCloud 文件。您可以使用NSFilePresenter 协议在应用程序的生命周期内监视您的 iCloud 目录的更改(以检测其他设备保存的文件)。
【讨论】:
好答案! OP 还应该研究 UIDocument 类,它可以自动执行其中一些任务 嗯,听起来还不错。我遇到了一个教程,它将***对象包装在 UIDocument 子类中,它们在视图控制器中处理加载/保存到 iCloud,但我觉得在***对象中有一个方法会更有意义这样做不必将代码复制到需要保存到 iCloud 的每个视图控制器。我的问题是:如果我要做后者,是否仍然可以向每个视图控制器添加一个侦听器,如果 iCloud 上的文件是从另一个设备更改的,它将更新我的***对象? 在代码重复方面,我处理它的方式是创建一个单独的类(我的是一个单例)来处理所有保存到 iCloud 文件夹并检测到 iCloud 文件夹中的更改。然后,您可以从应用程序中的任何位置生成数据对象,并将其传递给单例进行保存和上传;此类也可以发布通知,以便您的应用程序的不同部分可以响应 iCloud 文件夹中的更改。正如@Jef 所说, UIDocument 将为您自动执行其中的许多任务。但是,对于非基于文档的应用程序,我更喜欢这种方法。 那么当显示不同的视图时,他们如何知道 iCloud 文件夹何时发生了更改?您说您的单例实例响应更改,所以我假设这意味着一旦创建实例,无论当前视图如何,它仍然会响应?基本上我只希望一些视图控制器在“myObject”更改时刷新,而“myObject”会在 iCloud 文件夹发生更改时更改。 是的,请看how to make a singleton,但是类设计的本质是一旦实例化它就会一直存在。然后可以通知单例 iCloud 文件夹的更改并将这些通知传递到应用程序的其他部分。你不应该到处制作数百个单例,但它们对于指定特定的工作和分离代码非常有用。良好的组织。以上是关于NSKeyedArchiver 和 iCloud的主要内容,如果未能解决你的问题,请参考以下文章
NSKeyedArchiver 和 NSKeyedUnarchiver 与 NSMutableArray