2016-06-30 17 views
0

Ich versuche, Daten aus Cloud mit iCloud abrufen. Da ich das nur einmal machen möchte, lege ich meinen Code in die Datei didFinishLaunchingWithOptions in der AppDelegate.swift-Datei.Ausführen von CKQuery in AppDelegate - warten bis fertig

Ich versuche, dies auf dem Hauptthread auszuführen, so wird der Code, den ich in meinem ersten ViewController habe, nicht aufgerufen, bis ich die Daten bekommen habe.

func getPeople() { 
    let query = CKQuery(recordType: "Person", predicate: Predicate(format: "TRUEPREDICATE", argumentArray: nil)) 
    CKContainer.default().privateCloudDatabase.perform(query, inZoneWith: nil) { (records, error) in 
     if error == nil { 
      names.removeAll() 
      messages.removeAll() 
      pictures.removeAll() 
      recordIds.removeAll() 

      for record in records! { 

       names.append(record.object(forKey: "name") as! String) 
       messages.append(record.object(forKey: "message") as! String) 
       pictures.append(UIImage(data: record.object(forKey: "picture") as! NSData as Data)!) 
       recordIds.append(record.recordID) 

      } 

      print("done") 

     } else { 

      print(error) 
      print(error?.code) 

     } 

    } 

} 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    performSelector(onMainThread: #selector(getPeople), with: nil, waitUntilDone: true) 

    return true 
} 

Dies scheint jedoch nicht zu funktionieren. Die print("done") wird nach viewDidLoad in meinem ViewController aufgerufen. Ich habe noch nicht mit Multi-Threading gearbeitet und würde gerne wissen, wie ich anderen Code davon abhalten kann, angerufen zu werden, bis meine Anfrage fertig ist. Vielen Dank!

Antwort

0

Warten Sie nicht, bis die Daten geladen sind. Das Abrufen kann einige Sekunden dauern und die Benutzeroberfläche reagiert nicht. Und wenn es zu lange nicht reagiert, kann das System sogar Ihre App beenden. Aktualisieren Sie Ihre Ansichten stattdessen nach dem Eintreffen der Daten. Sie können NSNotificationCenter.defaultCenter().addObserver verwenden, um die Datenänderung zu beobachten.

Verwandte Themen