我在我的应用程序中使用CloudKit作为远程持久保存数据的方法.我的一个记录有一个CKAsset属性,用于保存图像.当我获取记录时,我意识到完成查询需要花费很多时间.经过多次测试,我得出结论,当您查询记录时,CloutKit会使用记录对象下载整个Asset文件.因此,当您从记录对象获取资产并请求它的fileURL时,它会为您提供本地文件路径URL而不是HTTP类型的URL.这对我来说是个问题,因为你必须让用户等待这么多时间才能在查询结束之前下载整个记录(及其相关图像).来自Parse背景,Parse用于为您提供HTTP URL,并且查询足够快以在加载图像异步时加载具有对象的UI.我的问题是,我怎样才能实现Parse的作用?我需要限制查询下载Assets数据并获取一个链接以异步加载图像.
解决方法
您可以使用CloudKit
JavaScript访问资产的网址.这是一个例子;
(使用Alamofire和SwiftyJSON)
func testRecordRequest() -> Request { let urlString = "https://api.apple-cloudkit.com/database/1/" + Constants.container + "/development/public/records/query?ckAPIToken=" + Constants.cloudKitAPIToken let query = ["recordType": "TestRecord"] return Alamofire.request(.POST,urlString,parameters: ["query": query],encoding: .JSON,headers: nil) }
JSON响应包含资产的“downloadURL”.
"downloadURL": "https://cvws.icloud-content.com/B/.../${f}?o=AmVtU..."
“${f}”似乎是一个变量,因此将其更改为您喜欢的任何内容.
let downloadURLString = json["fields"][FieldNames.image]["value"]["downloadURL"].stringValue let recordName = json["recordName"].stringValue let fileName = recordName + ".jpg" let imageURLString = downloadURLString.stringByReplacingOccurrencesOfString("${f}",withString: fileName)
现在我们可以使用这个urlString创建一个NSURL并将其用于任何图像和缓存解决方案,如Kingfisher,HanekeSwift等.(您可能还想保存图像类型png / jpg)