【问题标题】:NSKeyedArchiver and iCloudNSKeyedArchiver 和 iCloud
【发布时间】:2015-01-06 17:33:45
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

标签: ios objective-c icloud nsarchiving


【解决方案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 文件夹的更改并将这些通知传递到应用程序的其他部分。你不应该到处制作数百个单例,但它们对于指定特定的工作和分离代码非常有用。良好的组织。
猜你喜欢
  • 2014-11-24
  • 2011-12-09
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2012-12-16
  • 2013-06-08
相关资源
最近更新 更多