CloudKit API响应时间慢?

时间:2014-08-28 18:00:32

标签: swift cloudkit

我制作了一个简单的应用程序,用于与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)   
}

我正在我的iPhone 5上测试它,它连接到本地WiFi。我注意到保存的记录在调用完成处理程序之前很久就出现在CloudKit Dashboard中(我有足够的时间来检查),所以我怀疑我的代码中出错了。

2 个答案:

答案 0 :(得分:6)

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

func myHandler(results:[AnyObject]!, error:NSError!) {
NSOperationQueue.mainQueue().addOperationWithBlock({
        // ... put here your function code.
    })
}

可能是其他代码在主队列上执行,可能会阻止执行此代码。确保在后台队列上执行持久代码。

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

答案 1 :(得分:3)

添加到Edwin的答案......

我同意您尝试在后台线程上更新UI。

如果你想避免NSOperationQueue的复杂性......你可以......在ObjectiveC

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