2014-08-28 41 views
7

Tôi đã tạo một ứng dụng đơn giản để tương tác với cơ sở dữ liệu CloudKit. Về cơ bản nó chỉ là một bộ chọn ngày và hai nút, lần đầu tiên thêm một bản ghi mới với thời gian đã đặt vào cơ sở dữ liệu, và lần thứ hai lấy tất cả các bản ghi. Điều này dường như làm việc tốt ngoại trừ tất cả các hoạt động rất chậm. Mất khoảng 10 giây để nhận phản hồi từ cả saveRecord và performQuery. Tôi đang làm gì sai? Dưới đây là mã truy xuất hồ sơ.Thời gian phản hồi chậm từ API CloudKit?

@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) 
} 

Tôi đang thử nghiệm điều này trên iPhone 5, được kết nối với WiFi cục bộ. Tôi đã nhận thấy rằng các bản ghi đã lưu xuất hiện trong Bảng điều khiển CloudKit từ lâu trước khi trình xử lý hoàn thành được gọi (mà tôi có nhiều thời gian để kiểm tra), vì vậy tôi nghi ngờ tôi đã làm điều gì sai trong mã của mình.

Trả lời

6

Trình xử lý của bạn sẽ được gọi trong chuỗi nền. Bạn nên thực hiện tất cả các thao tác UI trên luồng chính. Bạn có thể đặt tất cả mã myHandler của mình trong một khối như:

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

Có thể mã khác đang thực thi trên hàng đợi chính có thể thực thi mã này. Đảm bảo bạn thực thi mã lâu dài trên hàng đợi nền.

Bên cạnh đó không có gì sai với mã của bạn.

+0

Đó dường như làm việc, cảm ơn bạn! – pc3e

+0

Ngay cả khi không có mã nào khác giữ nguyên chủ đề chính, có một sự trì hoãn lâu vì một số lý do. Dù sao gọi chủ đề chính sửa chữa sự chậm trễ nhờ. – malhal

3

Thêm vào câu trả lời Edwin của ...

Tôi đồng ý có vẻ như bạn đang cố gắng để cập nhật giao diện người dùng trên một sợi nền.

Nếu bạn muốn tránh sự phức tạp NSOperationQueue ... bạn có thể ... trong ObjectiveC

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

Hoạt động tương tự trong Swift: 'dispatch_async (dispatch_get_main_queue()) {...}' – hnh

Các vấn đề liên quan