簡體   English   中英

CloudKit 響應時間慢?

[英]CloudKit slow response time?

我正在嘗試從 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)
    }
}

我在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 倍......

感謝您的任何想法!

您可以嘗試設置QOS嗎?

operation.qualityOfService = .UserInitiated

為了獲得最大速度,您很可能希望異步加載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
   }
}

我也遇到了同樣的問題。

4 條記錄需要 12 秒才能加載。

問題

性能問題來自CKAsset

解決方案

我的解決方案是刪除CKAsset (頭像/圖像)。 將頭像/圖像存儲icloud 存儲中(使用有點復雜)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM