【问题标题】:CKQuery fails when returning large set返回大集合时 CKQuery 失败
【发布时间】:2016-06-05 21:57:44
【问题描述】:

我正在使用 CloudKit 在启动应用程序时下载文件。我有一个 CKQuery 可以找到所有尚未下载的文件。只下载一两个的时候可以正常下载,但是下载量很大的时候就失败了,报错:

\"服务器拒绝请求\" (15/2000); server message = \"内部服务器错误\";

这发生在设备或模拟器上。

相关代码

    let container = CKContainer(identifier: "iCloud.quaritate.Agni")
    let publicDB = container.publicCloudDatabase
    let privateDB = container.privateCloudDatabase

    let predicate = NSPredicate(format: "NOT (%@ CONTAINS Name)", downloadedTitles)
    let query = CKQuery(recordType: "List", predicate: predicate)
    publicDB.performQuery(query, inZoneWithID: nil, completionHandler: {
        results, error in
        if error != nil{
            //error getting lists
            NSLog("\(error?.description)")
        }else{
            //got lists
        }
    }

编辑
我已更新我的代码以使用 CKOperationQueue

func getNewWords(){
    let predicate = NSPredicate(format: "NOT (%@ CONTAINS Name)", downloadedTitles)
    let query = CKQuery(recordType: "List", predicate: predicate)

    let queryOperation = CKQueryOperation(query: query)
    let operationQueue = NSOperationQueue()
    self.executeQueryOperation(queryOperation, onOperationQueue: operationQueue)
}

func executeQueryOperation(queryOperation: CKQueryOperation, onOperationQueue operationQueue: NSOperationQueue) {
    NSLog("Executing query operation")
    let container = CKContainer(identifier: "iCloud.quaritate.Agni")
    let publicDB = container.publicCloudDatabase

    queryOperation.database = publicDB

    queryOperation.recordFetchedBlock = {(record:CKRecord) in
        self.saveRecord(record)
    }

    queryOperation.queryCompletionBlock = {(cursor:CKQueryCursor?, error:NSError?)->Void in
        guard error == nil else{
            NSLog("Query error: \(error?.description)")
            return
        }
        if let queryCursor = cursor { //there are more operations to execute
            let queryCursorOperation = CKQueryOperation(cursor: queryCursor)
            self.executeQueryOperation(queryCursorOperation, onOperationQueue: operationQueue)
        }
    }
    operationQueue.addOperation(queryOperation)
}

但仍然收到同样的错误。

【问题讨论】:

  • 用相关代码更新您的问题。
  • 您的问题很可能与stackoverflow.com/questions/29592964/…重复
  • 不低于一百
  • 您仍然需要使用相关代码更新您的问题。
  • 你真的应该使用CKQueryOperation。你有更多的控制权,可以处理更多的情况。

标签: ios cloudkit ckquery


【解决方案1】:

仔细检查downloadedTitles 不是一个空数组。如果在这样的查询中发送空数组,服务器将返回此错误。

这是来自服务器的一个糟糕的错误 - 我已经提交了一个错误,以便在这种情况下返回更好的错误消息(或者根本没有结果)。

【讨论】:

  • 你知道吗,它是。你是对的,这是一个糟糕的错误信息
【解决方案2】:

嗯,这实际上可能是内部错误。 我也遇到了 CloudKit 的错误,并在我在 Apple 开发者论坛上报告后得到了修复。试试那里,Apple 的开发人员可能会解决您的问题。

【讨论】:

  • 感谢您的帮助,但实际上是 farktronix 所说的
猜你喜欢
  • 2019-03-19
  • 1970-01-01
  • 2017-01-12
  • 2016-05-26
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
相关资源
最近更新 更多