我在我的应用程序中使用CloudKit作为远程持久保存数据的方法.我的一个记录有一个CKAsset属性,用于保存图像.当我获取记录时,我意识到完成查询需要花费很多时间.经过多次测试,我得出结论,当您查询记录时,CloutKit会使用记录对象下载整个Asset文件.因此,当你获得记录对象的资产,并要求它的fileURL,它给你一个本地文件路径的URL,而不是HTTP网址类型.这对我来说是个问题,因为你必须让用户等待这么多时间才能在查询结束之前下载整个记录(及其相关图像).从解析背景的,解析用来给你的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)
}
Run Code Online (Sandbox Code Playgroud)
JSON响应包含资产的"downloadURL".
"downloadURL": "https://cvws.icloud-content.com/B/.../${f}?o=AmVtU..."
Run Code Online (Sandbox Code Playgroud)
"$ {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)
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用这个urlString创建一个NSURL并将其用于任何图像和缓存解决方案,如Kingfisher,HanekeSwift等.(您可能还想保存图像类型png/jpg)
对同一条记录进行两次单独的调用。第一个调用应获取您想要的所有非资产字段,然后第二个请求应获取所需的资产。
就像是:
let dataQueryOperation = CKQueryOperation(query: CKQuery(predicate: myPredicate)
dataQueryOperation.desiredKeys = ["name", "age"] // etc
database.addOperation(dataQueryOperation)
let imageQueryOperation = CKQueryOperation(query: CKQuery(predicate: myPredicate)
imageQueryOperation.desiredKeys = ["images"]
database.addOperation(imageQueryOperation)
Run Code Online (Sandbox Code Playgroud)
如果需要,请将其重构为一个方法,以便您可以轻松地为每个包含资产的字段创建一个新的 CKQueryOperation。
狩猎快乐。
| 归档时间: |
|
| 查看次数: |
1473 次 |
| 最近记录: |