我正在尝试从Parse切换到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)
}
}
我在getPlayers(completionHandler: )
:
UITableViewController
函数
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倍......
感谢您的任何想法!
答案 0 :(得分:1)
您可以尝试设置QOS吗?
operation.qualityOfService = .UserInitiated
答案 1 :(得分:0)
为了获得最大速度,您很可能想要异步加载 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)
}
}
然后,对于cellForRowAtIndexPath
中的表加载,您可以通过完成块加载图像,但是您必须将所有UI放在主线程上,否则您将遇到随机崩溃,如:
object.fetchPhoto {
image in
dispatch_async(dispatch_get_main_queue()) {
cell.photo.image = image
}
}
答案 2 :(得分:0)
我也遇到了同样的问题。
加载4条记录需要12秒。
问题
性能问题来自CKAsset
解决方案
我的解决方法是删除CKAsset
(头像/图像)。将头像/图像存储在icloud storage中(用法有些复杂)。