好奇 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 不会更改,但如果这是您从服务器下载的资产,则仅保证数据存在于该位置,直到调用操作的完成块。之后,可以随时清理资产的备份文件以释放磁盘空间。

从服务器下载资产后,如果您想保留它,您应该将支持文件移动或复制到应用程序容器中的另一个位置。

【讨论】:

我猜你错了,同一条记录被下载了两次,它的资产fileUrlfirst是:file:///private/var/mobile/Containers/Data/Application/A59350D5-29A7-4449-9EC4-BD7AC9DFE24C/Library/Caches/CloudKit/Assets/A9A42324-769C-4EB6-B4AD-84AD3786DE38.01c9e1814d5722086f36c96607aaba3dc758ee65f7second:@ 987654325@ “.”之前它们是有区别的。我应该使用“。”之后的部分吗?在最后一个路径组件中?表现得像个CRC? 为了澄清我上面的评论,内存中CKAssetfileURL 属性不会改变。每次从服务器下载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 是不是会随时间变化?的主要内容,如果未能解决你的问题,请参考以下文章

单个 CKRecord 中的一系列 CKAsset 是不是存在问题?

所有 CKAsset 在所有设备上都可用?

长期运行的 CKAsset 上传错误

来自 CKAsset 的图像在 Swift 中乱序加载

使用 CloudKit 在用户之间共享 CKAsset?

CKAsset 不会显示在 tableview 图像中