2014-08-28 12 views
7

Zrobiłem prostą aplikację do interakcji z bazą danych CloudKit. Zasadniczo jest to tylko próbnik dat i dwa przyciski, pierwszy to dodanie nowego rekordu z ustawionym czasem do bazy danych, a drugi pobranie wszystkich rekordów. Wygląda na to, że działa dobrze, z tym że wszystkie operacje są bardzo powolne. Otrzymanie odpowiedzi z obu metod saveRecord i performQuery trwa około 10 sekund. Co ja robię źle? Poniżej znajduje się kod z pobierania rekordów.Powolny czas odpowiedzi z interfejsów 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) 
} 

Testuję to na moim iPhonie 5, który jest podłączony do lokalnego WiFi. Zauważyłem, że zapisane zapisy pojawiają się w CloudKit Dashboard na długo przed wywołaniem instrukcji obsługi zakończenia (mam dużo czasu na sprawdzenie), więc podejrzewam, że zrobiłem coś nie tak w moim kodzie.

Odpowiedz

6

Twój handler będzie wywoływany w wątku tła. Powinieneś wykonać wszystkie operacje na głównym wątku. można umieścić swój kod myHandler w bloku jak:

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

Być może inny kod jest wykonywany na głównej kolejki, które mogą pomieścić wykonanie tego kodu. Upewnij się, że wykonujesz długotrwały kod w kolejce w tle.

Poza tym nie ma nic złego w kodzie.

+0

, który wydaje się działać, dziękuję! – pc3e

+0

Nawet bez żadnego kodu podtrzymującego główny wątek, z jakiegoś powodu istnieje duże opóźnienie. W każdym razie wywołanie głównego wątku poprawia opóźnienie dzięki. – malhal

3

Dodawanie do odpowiedzi Edwina ...

zgadzam wygląda próbujesz zaktualizować UI w wątku tła.

Jeśli chcesz uniknąć NSOperationQueue złożoność ... mogłeś ... w ObjectiveC

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

Działa tak samo w Swift: 'dispatch_async (dispatch_get_main_queue()) {...}' – hnh

Powiązane problemy