Swift CloudKit API的响应时间慢?

Swift CloudKit API的响应时间慢?,swift,cloudkit,Swift,Cloudkit,我制作了一个与CloudKit数据库交互的简单应用程序。本质上,它只是一个日期选择器和两个按钮,第一个按钮向数据库添加一个具有设置时间的新记录,第二个按钮检索所有记录。这似乎工作得很好,只是所有操作都非常缓慢。从saveRecord和performQuery获得响应大约需要10秒钟。我做错了什么?下面是检索记录的代码 @IBAction func retreiveButtonClick(sender: AnyObject) { self.labelOutlet.text = "Waiti

我制作了一个与CloudKit数据库交互的简单应用程序。本质上,它只是一个日期选择器和两个按钮,第一个按钮向数据库添加一个具有设置时间的新记录,第二个按钮检索所有记录。这似乎工作得很好,只是所有操作都非常缓慢。从saveRecord和performQuery获得响应大约需要10秒钟。我做错了什么?下面是检索记录的代码

@IBAction func retreiveButtonClick(sender: AnyObject) {
    self.labelOutlet.text = "Waiting..."

    func myHandler(results:[AnyObject]!, error:NSError!) {
        if let err = error {
            println("err: \(err.localizedDescription)")
        } else {
            self.labelOutlet.text = "Got \(results.count) results:"
            for record in results {
                let time = record.objectForKey("testTime") as NSDate
                self.labelOutlet.text = self.labelOutlet.text + "\n\(time.description)"
            }
        }
    }

    var query = CKQuery(recordType:"TestTable", predicate:NSPredicate(value:true))
    cloudDatabase.performQuery(query, inZoneWithID: nil, myHandler)   
}

我正在我的iPhone5上测试这个,它连接到本地WiFi。我注意到,在调用完成处理程序之前,保存的记录就会显示在CloudKit Dashboard中(我有足够的时间来检查),因此我怀疑我的代码中有错误。

您的处理程序将在后台线程中被调用。您应该在主线程上执行所有UI操作。您可以将所有myHandler代码放在一个块中,如:

func myHandler(results:[AnyObject]!, error:NSError!) {
NSOperationQueue.mainQueue().addOperationWithBlock({
        // ... put here your function code.
    })
}
可能是其他代码正在主队列上执行,这可能会阻碍此代码的执行。确保在后台队列上执行持久代码


除此之外,您的代码没有问题。

在Edwin的答案中添加

我同意,看起来您正在尝试在后台线程上更新UI

如果您想避免NSOperationQueue的复杂性…可以…在Objective中

dispatch_async(dispatch_get_main_queue(), ^{
     //...update code 
});

在Swift中的工作原理相同:
dispatch\u async(dispatch\u get\u main\u queue()){…}
即使没有其他代码占用主线程,由于某种原因也会有很长的延迟。无论如何,调用主线程可以修复延迟,谢谢。