- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用 CloudKit 作为我的 iOS 应用程序的服务器后端。我用它来存放一些相对静态的数据以及一些图像 (CKAsset)。当我真正从公共(public)数据库中获取这些 Assets 时,我遇到了一个问题。它们以极慢的速度加载。
我的用例是将图像加载到 Collection View 内的每个单元格中。这些图像只有 200kb 大小,但提取过程平均需要 2.2 秒才能完成下载并将图像设置在一个单元格中。为了比较,我获取了相似大小的图片的 URL,并使用 NSURLSession 加载它们。每张图片的加载时间仅为 0.18 - 0.25 秒。
我尝试了多种从CK下载图片的方式:直接抓取记录、查询、操作查询。他们都有相似的结果。在为单元格设置图像之前,我还在完成 block 内分派(dispatch)回主队列。
我的数据库设置为具有一个包含多个数据字段的主要对象。然后,我为照片设置了一个向后引用样式系统,其中每张照片都只引用了一个主要对象。这样我就可以按需加载照片,而不会影响主要数据。
看起来像这样:
主要对象:title: String, startDate: Date
照片对象:owner: String(对主要对象的引用),image: Asset
这是我尝试直接获取其中一张照片的示例请求:
let publicDb = CKContainer.defaultContainer().publicCloudDatabase
let configRecordId = CKRecordID(recordName: "e783f542-ec0f-46j4-9e99-b3e3ez505adf")
publicDb.fetchRecordWithID(configRecordId) { (record, error) -> Void in
dispatch_async(dispatch_get_main_queue()) {
guard let photoRecord = record else { return }
guard let asset = photoRecord["image"] as? CKAsset else { return }
guard let photo = NSData(contentsOfURL: asset.fileURL) else { return }
let image = UIImage(data: photo)!
cell.cardImageView.image = image
}
}
我似乎不明白为什么这些图片下载要花这么长时间,但如果我不能让它们在合理的时间内加载,那真的很糟糕。
更新:我尝试使用较小的图像(23kb)进行提取操作。获取速度更快,从 0.3 到 1.1 秒不等。这样更好,但仍然不符合我对 CloudKit 应该能够提供的功能的期望。
最佳答案
我正在使用 CKQueryOperation。我发现一旦我将以下行添加到我的代码中,下载 CKAssets 的速度就会提高大约 5-10 倍。
queryOperation.qualityOfService = .UserInteractive
这是我的完整代码:
func getReportPhotos(report:Report, completionHandler: (report:Report?, error:NSError?) -> ()) {
let photo : Photo = report.photos![0] as! Photo
let predicate : NSPredicate = NSPredicate(format: "recordID = %@", CKRecordID(recordName: photo.identifier!))
let query : CKQuery = CKQuery(recordType: "Photo", predicate: predicate)
let queryOperation : CKQueryOperation = CKQueryOperation()
queryOperation.query = query
queryOperation.resultsLimit = numberOfReportsPerQuery
queryOperation.qualityOfService = .UserInteractive
queryOperation.recordFetchedBlock = { record in
photo.date = record.objectForKey("date") as? NSDate
photo.fileType = record.objectForKey("fileType") as? String
let asset : CKAsset? = record.objectForKey("image") as? CKAsset
if asset != nil {
let photoData : NSData? = NSData(contentsOfURL:asset!.fileURL)
let photo : Photo = report.photos![0] as! Photo
photo.image = UIImage(data:photoData!)
}
}
queryOperation.queryCompletionBlock = { queryCursor, error in
dispatch_async(dispatch_get_main_queue(), {
completionHandler(report: report, error: error)
})
}
publicDatabase?.addOperation(queryOperation)
}
关于ios - 从 CloudKit 获取 CKAsset 图像非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35448287/
要在私有(private) CKRecordZone 中添加 CKRecord,您需要确保该区域已经存在。 但这是否意味着每次我需要插入记录时,我都需要获取所有区域并使用 fetchAllRecord
我正在与 cloudkit 仪表板交互并查看我的应用程序收集的数据。 如何从仪表板导出所有数据(数据 -> csv 或 json),以便我可以对其进行一些分析? 谢谢! 最佳答案 我认为苹果永远不会提
我使用 Cloudkit 和私有(private)数据库将一些文件存储到 iCloud 并在 iOS 和 OSX 之间同步。现在我想实现一些东西,用户可以在不离开应用程序并查看首选项的情况下查看他的
我有两个看起来像这样的 CloudKit 数据对象: 父对象: { "records": [ { "recordName": "14102C0A-60F
有谁知道这个闭包中的String字段的用途public var recordWithIDWasDeletedBlock: ((CKRecordID, String) -> Void)?。我不知道它的用
我的应用程序在 CloudKit 中执行的几乎所有操作现在都会返回此错误: (lldb) po [error userInfo] { CKDHTTPHeaders = {
我在尝试初始化 Cloudkit schema 时遇到此错误: Error Domain=NSCocoaErrorDomain Code=134060 "A Core Data error occur
我正在更新 iOS13 之前的 Core Data 应用程序以使用 Core Data+CloudKit 同步来支持多个设备上的单个用户。同步应该是自动发生的,并且在我开发的一个中间步骤中它确实起作用
有没有办法使用 CloudKit 获取 iCloud 笔记?我看过文档: https://developer.apple.com/library/archive/documentation/DataM
swift 3.1,Xcode 8.3.3 我在 CloudKit 中有一个名为 Aircraft 的记录类型,它有一个名为 fieldValues 的字段,类型为 Reference List。 在
swift 3.1,Xcode 8.3.3 我在 CloudKit 中有一个名为 Aircraft 的记录类型,它有一个名为 fieldValues 的字段,类型为 Reference List。 在
当我尝试从 CloudKit Dashboard 查询 CloudKit 时,收到一条错误消息: There was a problem querying the “Entry” type. no a
出于某种原因,一小部分 iOS 10 用户无法从我的公共(public) iCloud 容器中读取数据。 CloudKit 返回的 localisedError 是“Account doesn't h
我有一个在 iOS 上运行良好的应用程序,但是当使用催化剂运行时,如果我在 macOS 上滑动到另一个虚拟桌面,然后再返回大约 10 次,它会间歇性地崩溃。它主要发生在 UICollectionVie
用户 B 从用户 A 拥有的共享记录中删除自己的正确方法是什么?我想我记得从一些 WWDC 视频中用户 B 会删除 CKShare来自他的共享数据库,但在查看用户 A 设备的权限时,该用户似乎仍然是参
对于我们的消息传递应用程序,如果我们将用户消息直接发送到 CloudKit (不做任何我们自己的加密),我们可以声称我们的应用程序是 end-to-end encrypted ,“只有通信用户可以阅读
我之前曾尝试使用 OSX/iOS 应用程序实现 CloudKit,由于我的强制症,我非常担心设备之间某些数据的优先级,以及可能丢失数据或恢复已删除的数据。 我的逻辑是,将从 iCloud 获取的数据和
Apple 发布了一种针对 CloudKit 的服务器到服务器进行身份验证的新方法。 https://developer.apple.com/library/content/documentation
因此根据Apple的文档,未登录iCloud的用户仍然可以从公共(public)数据库中读取数据,但是在查询公共(public)数据库时,我收到以下错误: Error Domain=NSCocoaEr
我需要创建一个CKQuery,其中谓词包含记录的引用,而不是记录的字段。 像这样 let query = CKQuery(recordType: "OUP", predicate: NSPredica
我是一名优秀的程序员,十分优秀!