【发布时间】:2016-02-26 11:48:42
【问题描述】:
我目前在我的 iOS 应用程序中使用本地存储。用户数据存储在 Document Directory 中,现在我打算使用 iCloud Documents 存储。
我打算这样做:
检查 iCloud 在设备上是否可用
如果是,使用 URLForUbiquityContainerIdentifier 获取 iCloud 容器 URL
将新文件和文档保存到这个新 URL
为此,我使用此代码将返回文档文件夹的 URL(iCloud 或本地)
class CloudDataManager {
class func getDocumentDiretoryURL() -> NSURL {
let localDocumentsURL = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: .UserDomainMask).last! as NSURL
let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(nil)?.URLByAppendingPathComponent("Documents")
if userDefault.boolForKey("useCloud") && iCloudDocumentsURL != nil {
return iCloudDocumentsURL!
} else {
return localDocumentsURL
}
}
}
这是最佳实践吗? 我担心如果有一天 iCloud 不可用会出现问题,因此将使用本地目录而不是云容器并且为空。 谢谢。
【问题讨论】:
-
我使用与您相同的代码删除 iCloud 文件,但该文件没有被删除。我只是想确认您的删除功能确实适用于您应用中的 iCloud 文件?
-
我在我的应用程序中删除 iCloud 文件没有问题。有时可能需要超过 2 分钟才能真正看到文件从 iCloud 容器中消失。
-
谢谢。我发现删除对我有用。但是,当我尝试更新 iCloud 中已经存在的文件时,我最终只会得到一个同名的新文件,其后有一个数字。因此,我决定首先检查文件是否在 iCloud 中,如果是,则删除然后添加具有相同名称的新文件。这仍然会导致保存副本,并且原始文件在那里(未删除)。但是,当我只是尝试删除一个文件时,它被删除了。奇怪……不知道为什么会这样。
-
圣诞快乐。这取决于您如何编写数据。就我而言,我使用 NSKeyedArchiver.archiveRootObject 因为我的对象继承自 NSCoding。 Here is an explanation。这使您可以将自定义对象保存到存储文件中的数组中。要更新作为对象数组的数据,我从 iCloud 容器(或本地目录,如果未启用 iCloud)加载此文件的 URL,然后我将新数据附加到此数组,最后我使用 archiveRootObject 将新数组保存到文件系统自动写入文件
-
否则如果你有很多文件要写入或更新,你可以使用 UIDocument 类来管理写入,如果你尝试从不同的设备同时写入,它也会自动避免冲突。如果您需要,请在 PM 中与我联系,如果您投票支持我的答案,我将不胜感激,谢谢 ;)