CloudKit Fehlerbehandlung - Logik wiederholen
Ich möchte eine ausgezeichnete CloudKit-Fehlerbehandlung in meine App integrieren, wie Apple dies von uns verlangt. Ich möchte jetzt einen Datensatz speichern und ändern. Hier ist meine grundlegende Speicherlogik ...
func addNewRecord(managedObj: NSManagedObject) {
let newRec = managedObj.convertToCkRecord()
publicDB.saveRecord(newRec, completionHandler: saveHandler)
}
func saveHandler(savedRecord: CKRecord?, error: NSError?) {
// handle errors here
if let error = error {
if error.code == CKErrorCode.NotAuthenticated.rawValue {
// debug
print("Not authentricated")
}
else if error.code == CKErrorCode.NetworkFailure.rawValue {
print("Network failure!!")
if let retryAfterValue = error.userInfo[CKErrorRetryAfterKey] as? NSTimeInterval {
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(retryAfterValue * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
// THIS IS WHERE I GET STUCK, WHERE DO I FIND THE FAILED CKRECORD FOR RETRY?
// IS IT IN USERINFO SOMEWHERE?
//self.saveHandler(savedRecord, error: error)
}
}
}
}
else {
print("Save was a success! \(savedRecord)")
}
}
Dies scheint, es sollte grundlegend sein, aber jedes Beispiel, das ich darüber sehe, hat nur einen Kommentar//retry
oder//handle error
, auch in den WWDC-Tutorials, wo die Fehlerbehandlung hingehen soll. Ich möchte wissen, wie ich einen Verweis auf meinen fehlgeschlagenen CKRecord finde. Das Speichern in einer lokalen Variablen scheint aufgrund des Multithreading-Problems nicht zu funktionieren. Ich habe versucht, es zu einer Warteschlange hinzuzufügen, aber andere Threads könnten ebenfalls in diese Warteschlange gelangen, also mache ich mir Sorgen um die Rennbedingungen.