2016-04-26 17 views
4

Ich brauche Hilfe, um zu lernen, wie Fehler beim Abrufen von Datensätzen über CloudKit richtig behandelt werden. Derzeit habe ich eine App, die zahlreiche Datensätze in der Cloud speichert und beim Start lädt. Ich verweise auf die Datensätze mit einer CKReference, und wenn ich die Referenz speichern verwende ich die CKReferenceAction.DeleteSelf Option. Ein Problem, auf das ich in regelmäßigen Abständen gestoßen bin, ist, dass wenn ein referenzierter Datensatz gelöscht wird, manchmal eine beträchtliche Zeit verstreichen kann, bevor sich der Verweis selbst löscht. Dies hat dazu geführt, dass ich gelegentlich auf die Situation stoße, dass meine App einen CKReference für einen Datensatz abgerufen hat, der nicht mehr existiert. Ich bin in der Lage, manuell herauszufinden, wenn dies geschieht, indem Sie print(error!) in meinem Error-Handler einfügen. Was ich gerne wissen würde, ist, wie ich einen Code hinzufügen kann, um diesen spezifischen Fehler zu erkennen, d. H. if error.localizedDescription == ??? {. Hier ist der grundlegende Code, den ich für die bin mit holen:CloudKit Fehlerdifferenzierung

let fetch = CKFetchRecordsOperation(recordIDs: recordIDs) 
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in 

    if error != nil { 

     // Error Line A (See below) 
     print("ERROR! : \(error!.localizedDescription)") 

     // Error Line B (See below) 
     print("ERROR: \(error!)") 

    } 

    else if let record = record { 

     // Record was found 
    } 
} 
if let database = self.privateDatabase { 
    fetch.database = database 
    fetch.start() 
} 

Und dann, wenn es versucht, die nicht vorhandenen Datensatz zu holen, hier ist die Fehlermeldung, die im Compiler-Fenster druckt:

a) ERROR! : Error fetching record <CKRecordID: 0x10025b290; dbbda7c3-adcc-4271-848f-6702160ea34f:(_defaultZone:__defaultOwner__)> from server: Record not found

b) ERROR: <CKError 0x125e82820: "Unknown Item" (11/2003); server message = "Record not found"; uuid = (removed); container ID = "(removed)">

Above in Fehlerzeile B, wo es CKError 0x125e82820: sagt, kann ich diese verwenden, um eine zu erstellen, wenn Anweisung für diesen speziellen Fehlertyp zu überprüfen? Ich könnte wirklich jede Hilfe verwenden, um einen Weg zu finden, dieses Problem richtig zu lösen, wenn es passiert. Ich habe eine Ladestruktur für meine App eingerichtet, und wenn sie denkt, dass es einen Datensatz gibt, den sie finden muss, aber nicht kann, wird mein Ladeprozess beschädigt. Ich würde wirklich jede Hilfe schätzen, die ich bekommen kann, ich nehme an, es ist eine einfache Lösung, aber anscheinend nicht eine, die ich finden konnte. Vielen Dank!

UPDATE -

Dank @AaronBrager konnte ich die richtige Lösung finden. Sie können den Fehlercode überprüfen, um ihn einem bestimmten Fehler zuzuordnen, und die Domäne, um sicherzustellen, dass es sich um einen CKError handelt. Hier ist die Lösung, die für mich funktioniert:

let fetch = CKFetchRecordsOperation(recordIDs: recordIDs) 
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in 

    if error != nil { 

     if error!.code == CKErrorCode.UnknownItem.rawValue && error!.domain == CKErrorDomain { 

      // This works great! 

     } 

    } 

    else if let record = record { 

     // Record was found 

    } 
} 
if let database = self.publicDatabase { 
    fetch.database = database 
    fetch.start() 
} 
+0

Sie sollten in der Lage sein, die Ursache eines Fehlers eindeutig zu identifizieren, indem Sie seine Variablen 'domain' und' code' untersuchen. Gleiche 'Domain' und' Code', dasselbe Problem. Im Gegensatz zu "localizedDescription" wird es nicht zwischen Benutzern geändert. –

+0

Also sollte ich in der Lage sein, den gleichen Fehler immer zu identifizieren, wenn ich einfach eine Logik wie folgt hinzufüge: 'if error.code == CKErrorCode.UnknownItem'? Ich werde es ausprobieren. Danke – Pierce

+0

Sie sollten den Code _und die Domäne_ testen, da das Fehlerobjekt möglicherweise kein CloudKit-Fehler ist. –

Antwort

2

sollten Sie in der Lage sein, eindeutig ein Fehler vorliegt Ursache zu identifizieren durch seine domain und code Variablen inspizieren. Gleiches domain und code, dasselbe Problem. Und im Gegensatz zu localizedDescription wird es nicht zwischen Benutzern wechseln.