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!