首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CloudKit响应时间慢吗?

CloudKit响应时间慢吗?
EN

Stack Overflow用户
提问于 2016-04-27 00:43:29
回答 3查看 596关注 0票数 1

到目前为止,我正在尝试从解析切换到CloudKit,并让我的样例正常工作。我得到了一个看起来像这样的CLoudKitModel:

代码语言:javascript
复制
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: )函数

代码语言:javascript
复制
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倍……

谢谢你的任何想法!

EN

回答 3

Stack Overflow用户

发布于 2016-04-27 03:22:27

您可以尝试设置QOS吗?

代码语言:javascript
复制
operation.qualityOfService = .UserInitiated
票数 1
EN

Stack Overflow用户

发布于 2016-04-27 07:16:32

为了获得最快的速度,您很可能希望异步加载CKAsset 图像,因此将加载的播放器图像包装在后台线程操作块中。

下面是我的代码中的一个例子,它获取你可以推断出的照片:

代码语言:javascript
复制
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)
  }
 }

代码语言:javascript
复制
object.fetchPhoto {
  image in
   dispatch_async(dispatch_get_main_queue()) {
    cell.photo.image = image
   }
}
票数 0
EN

Stack Overflow用户

发布于 2019-06-25 13:45:25

我也遇到了同样的问题。

加载4条记录需要12秒。

Problem

性能问题来自CKAsset

解决方案

我的解决方案是删除CKAsset(头像/图像)。将头像/图像存储在icloud storage中(使用方法有点复杂)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36870939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档