2014-08-28 79 views
7

我已经做了一个简单的应用程序与CloudKit数据库进行交互。本质上它只是一个日期选择器和两个按钮,第一个按照设定的时间向数据库中添加新记录,第二个按钮则检索所有记录。这似乎工作正常,但所有操作都非常缓慢。从saveRecord和performQuery中获取响应大约需要10秒钟。我究竟做错了什么?以下是检索记录的代码。来自CloudKit API的响应时间慢?

@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中很久,所以我怀疑我在代码中做了什么错误。

回答

6

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

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

这可能是因为其他的代码上,可以撑起这个代码的执行主队列执行。确保你在后台队列上执行持久代码。

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

+0

这似乎工作,谢谢! – pc3e 2014-08-30 10:26:49

+0

即使没有其他代码阻止主线程出于某种原因长时间延迟。无论如何,调用主线程修复延迟谢谢。 – malhal 2015-08-28 21:53:36

3

添加到Edwin的答案...

我同意它看起来像你试图更新在后台线程的用户界面。

如果你想避免NSOperationQueue复杂...你能...中的ObjectiveC

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

在Swift中工作相同:'dispatch_async(dispatch_get_main_queue()){...}' – hnh 2014-09-01 11:09:49