2014-08-28 9 views
7

Я создал простое приложение для взаимодействия с облачной базой данных CloudKit. По сути, это всего лишь выбор даты и две кнопки, первая добавка новой записи с установленным временем в базу данных, а вторая - извлечение всех записей. Кажется, что это работает отлично, за исключением того, что все операции очень медленные. Для получения ответа от saveRecord и performQuery требуется около 10 секунд. Что я делаю не так? Ниже приведен код восстановления записей.Медленное время отклика от 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) 
} 

Я тестирую это на своем iPhone 5, который подключен к локальному Wi-Fi. Я заметил, что сохраненные записи отображаются в CloudKit Dashboard задолго до того, как вызывается обработчик завершения (у меня есть достаточно времени для проверки), поэтому я подозреваю, что сделал что-то не так в своем коде.

ответ

6

Ваш обработчик будет вызываться в фоновом режиме. Вы должны выполнить все манипуляции с пользовательским интерфейсом в основном потоке. Вы можете поместить весь код MyHandler внутри блока, как:

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

Это может быть, что другой код выполняется на главную очереди, которая может задержать выполнение этого кода. Убедитесь, что вы выполняете длительный код в фоновом режиме.

Кроме того, в коде нет ничего плохого.

+0

Это, кажется, работает, спасибо! – pc3e

+0

Даже без какого-либо другого кода, поддерживающего основную тему, по какой-то причине длинная задержка. Во всяком случае, вызов основного потока исправляет задержку. – malhal

3

Добавление ответа Эдвина ...

Я согласен, это выглядит, как вы пытаетесь обновить пользовательский интерфейс на фоне потока.

Если вы хотите, чтобы избежать NSOperationQueue сложности ... вы могли ... в ObjectiveC

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

Работает так же в Swift: 'dispatch_async (dispatch_get_main_queue()) {...}' – hnh