2014-08-28 82 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