好奇 CKAsset 的 fileUrl 是不是会随时间变化?
Posted
技术标签:
【中文标题】好奇 CKAsset 的 fileUrl 是不是会随时间变化?【英文标题】:Curious whether fileUrl of CKAsset can change with time?好奇 CKAsset 的 fileUrl 是否会随时间变化? 【发布时间】:2015-04-26 15:26:57 【问题描述】:我也在客户端缓存 CKRecord 和 CKAsset 的 fileUrl。 fileUrl 可以不时更改吗?资产/数据本身没有变化。
【问题讨论】:
【参考方案1】:资产的fileURL
不会更改,但如果这是您从服务器下载的资产,则仅保证数据存在于该位置,直到调用操作的完成块。之后,可以随时清理资产的备份文件以释放磁盘空间。
从服务器下载资产后,如果您想保留它,您应该将支持文件移动或复制到应用程序容器中的另一个位置。
【讨论】:
我猜你错了,同一条记录被下载了两次,它的资产fileUrl
first是:file:///private/var/mobile/Containers/Data/Application/A59350D5-29A7-4449-9EC4-BD7AC9DFE24C/Library/Caches/CloudKit/Assets/A9A42324-769C-4EB6-B4AD-84AD3786DE38.01c9e1814d5722086f36c96607aaba3dc758ee65f7
second:@ 987654325@
“.”之前它们是有区别的。我应该使用“。”之后的部分吗?在最后一个路径组件中?表现得像个CRC?
为了澄清我上面的评论,内存中CKAsset
的fileURL
属性不会改变。每次从服务器下载CKAsset
时,您都会获得一个新的CKAsset
实例,它可能有不同的fileURL
。你不应该对fileURL
字符串的格式做任何假设。
我构建这个是为了解决一大堆问题。希望它可以帮助某人。这个框架处理一切。从下载到缓存,您只需要记录 ID 和资产的属性键。您可以直接在 imageview 上使用这些方法。希望这可以帮助。随时帮助改进它。 github.com/agibson73/AGCKImage
有什么原因我不能硬链接文件而不是复制?此外,移动似乎不是一个好主意,因为 CloudKit 可能仍会尝试使用它。如果它消失了,甚至可以尝试重新下载。我将尝试链接,如果遇到问题我会报告。 (如果可行,效率会更高,空间不足的风险几乎为零)【参考方案2】:
存档的 URL 是一个完整路径,但由于 ios 8 左右,您的应用用于存储其文件的容器 URL 每次应用启动时都会发生变化。
所以存档的网址是错误的。
这对我来说似乎是 CKAsset 归档方式中的一个错误,它们应该归档和取消归档相对于应用程序容器的部分路径。不是完整路径。
我想我会归档一个雷达。
编辑:这是一个解决方案:
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 是不是会随时间变化?的主要内容,如果未能解决你的问题,请参考以下文章