好奇 CKAsset 的 fileUrl 是否可以随时间变化?
Curious whether fileUrl of CKAsset can change with time?
我也在客户端和 CKAsset 的 fileUrl 上缓存 CKRecord。 fileUrl 可以不时更改吗?资产/数据本身没有变化。
资产的 fileURL
不会改变,但如果这是您从服务器下载的资产,则数据只能保证存在于该位置,直到调用操作的完成块。在那之后,可以随时清理资产的支持文件以释放磁盘 space.
从服务器下载资产后,如果您想保留它,您应该将备份文件移动或复制到应用程序容器中的另一个位置。
存档的 URL 是一个完整路径,但自从 iOS 8 左右以来,您的应用程序用来存储其文件的容器 URL 每次都会更改 应用启动。
所以归档的URL是错误的
这对我来说似乎是 CKAssets 存档方式中的错误,它们应该存档和取消存档相对于应用程序容器的部分路径。不是完整路径。
我想我会提交一个雷达。
编辑:这是一个解决方案:
extension CKAsset {
var url: URL? {
let path = fileURL.path
if FileManager.default.fileExists(atPath: path) {
return fileURL
} else if let index = path.range(of: "/Library/Caches/") {
// archived CKAssets store full-path URLs but since iOS 8 or so
// the path of our container (home-dir) changes every time we are
// started. So the full path is useless. Try to mangle it.
let suffix = String(path.suffix(from: index.upperBound))
let adjustedUrl = URL.caches/suffix
if FileManager.default.fileExists(atPath: adjustedUrl.path) {
return adjustedUrl
}
}
return nil
}
}
public extension URL {
static var caches: URL {
return FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first ?? URL(fileURLWithPath: "")
}
}
我也在客户端和 CKAsset 的 fileUrl 上缓存 CKRecord。 fileUrl 可以不时更改吗?资产/数据本身没有变化。
资产的 fileURL
不会改变,但如果这是您从服务器下载的资产,则数据只能保证存在于该位置,直到调用操作的完成块。在那之后,可以随时清理资产的支持文件以释放磁盘 space.
从服务器下载资产后,如果您想保留它,您应该将备份文件移动或复制到应用程序容器中的另一个位置。
存档的 URL 是一个完整路径,但自从 iOS 8 左右以来,您的应用程序用来存储其文件的容器 URL 每次都会更改 应用启动。
所以归档的URL是错误的
这对我来说似乎是 CKAssets 存档方式中的错误,它们应该存档和取消存档相对于应用程序容器的部分路径。不是完整路径。
我想我会提交一个雷达。
编辑:这是一个解决方案:
extension CKAsset {
var url: URL? {
let path = fileURL.path
if FileManager.default.fileExists(atPath: path) {
return fileURL
} else if let index = path.range(of: "/Library/Caches/") {
// archived CKAssets store full-path URLs but since iOS 8 or so
// the path of our container (home-dir) changes every time we are
// started. So the full path is useless. Try to mangle it.
let suffix = String(path.suffix(from: index.upperBound))
let adjustedUrl = URL.caches/suffix
if FileManager.default.fileExists(atPath: adjustedUrl.path) {
return adjustedUrl
}
}
return nil
}
}
public extension URL {
static var caches: URL {
return FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first ?? URL(fileURLWithPath: "")
}
}