到目前为止,我正在尝试从解析切换到CloudKit,并让我的样例正常工作。我得到了一个看起来像这样的CLoudKitModel:
class CloudKitModel {
let container: CKContainer
let privateDB: CKDatabase
let publicDB: CKDatabase
init() {
container = CKContainer.defaultContainer()
privateDB = container.privateCloudDatabase
publicDB = container.publicCloudDatabase
}
func getPlayers(completionHandler: (data: [CloudKitPlayers]?, success: Bool) -> ()) {
var playerArray = [CloudKitPlayers]()
let predicate = NSPredicate(value: true)
let sort = NSSortDescriptor(key: "sortID", ascending: true)
let query = CKQuery(recordType: "Player", predicate: predicate)
query.sortDescriptors = [sort]
let operation = CKQueryOperation(query: query)
operation.recordFetchedBlock = { (record) in
let players = CloudKitPlayers()
players.age = record["age"] as! Int
players.name = record["name"] as! String
players.nickname = record["nickname"] as! String
players.position = record["position"] as! String
let imageData = record["image"] as! CKAsset
players.image = UIImage(contentsOfFile: imageData.fileURL.path!)
playerArray.append(players)
}
operation.queryCompletionBlock = { (cursor, error) in
if error == nil {
print("Fetched all players")
if playerArray.count > 0 {
completionHandler(data: playerArray, success: true)
} else {
completionHandler(data: nil, success: false)
}
}
}
self.publicDB.addOperation(operation)
}
}我在UITableViewController中调用了这个getPlayers(completionHandler: )函数
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let cloudKit = CloudKitModel()
cloudKit.getPlayers { (data, success) in
if success {
if let playerArray = data {
self.players = playerArray
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
})
print("reloaded tableView")
}
} else {
print("no success")
}
}
}问题是:在TableView中显示名称平均需要10秒左右。这并不是说我一次就能得到一千条记录,这些只是我从iCloud加载的8个数据集。我读到我应该在主线程上执行tableView.reloadData(),但这也没有帮助。
我还遗漏了什么吗?或者有什么特殊的方法来调试它吗?与Parse相比,这个解决方案要慢10倍……
谢谢你的任何想法!
发布于 2016-04-27 03:22:27
您可以尝试设置QOS吗?
operation.qualityOfService = .UserInitiated发布于 2016-04-27 07:16:32
为了获得最快的速度,您很可能希望异步加载CKAsset 图像,因此将加载的播放器图像包装在后台线程操作块中。
下面是我的代码中的一个例子,它获取你可以推断出的照片:
var backgroundQueue = NSOperationQueue()
func fetchPhoto(completion:(photo: UIImage!) -> ()) {
backgroundQueue.addOperationWithBlock() {
let image = self.record["Photo"] as? CKAsset
if let ckAsset = image {
let url = ckAsset.fileURL
if let imageData = NSData(contentsOfURL:url) {
self.photo = UIImage(data: imageData)
}
}
completion(photo: self.photo)
}
}object.fetchPhoto {
image in
dispatch_async(dispatch_get_main_queue()) {
cell.photo.image = image
}
}发布于 2019-06-25 13:45:25
我也遇到了同样的问题。
加载4条记录需要12秒。
Problem
性能问题来自CKAsset
解决方案
我的解决方案是删除CKAsset(头像/图像)。将头像/图像存储在icloud storage中(使用方法有点复杂)。
https://stackoverflow.com/questions/36870939
复制相似问题