好奇CKAsset的fileUrl是否可以随时间变化?

时间:2015-04-26 15:26:57

标签: ios cloudkit ckasset

我也在CKAdset的客户端和fileUrl上缓存CKRecord。 fileUrl可以不时更改吗?资产/数据本身并没有改变。

2 个答案:

答案 0 :(得分:3)

资产的fileURL不会更改,但如果这是您从服务器下载的资产,则只保证在该位置存在数据,直到调用操作的完成块为止。在此之后,可以随时清理资产的备份文件以释放磁盘空间。

从服务器下载资产后,您应该将备份文件移动或复制到应用程序容器中的其他位置(如果您要保留它)。

答案 1 :(得分:0)

归档网址是一个完整路径,但由于iOS 8左右,您的应用用于存储其文件的容器网址会随时更改应用程序启动。

因此存档的网址错误。

这似乎是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: "")
    }
}