2017-09-24 2 views
1

In meiner App, wenn innerhalb func fetchZoneChanges(database: CKDatabase, databaseTokenKey: String, zoneIDs: [CKRecordZoneID], completion: @escaping() -> Void) beendet, update ich CoreData Datensatz in meiner Core Data-Datenbank mit dem neuen Namen Wert von CloudKit erhalten .Versuch zum rekursiven Aufruf von -save: beim Abbruch des Kontexts beim Speichern von Core Data viewContext nach dem CloudKit Datensatz geändert

Der Fehler Versuche rekursiv -save zu nennen: auf dem Kontext abgebrochen erscheint, wenn ich versuche, Kontext zu speichern.

func updateCoreDataRecord(editedRecord: Record, newName: String, handleComplete_RecordEditedInCoreData:(()->())) { 

     let record_RecordID = editedRecord.recordID! 

     let request: NSFetchRequest<Record> = Record.fetchRequest() 
     request.predicate = NSPredicate(format: "recordID = %@", record_RecordID) 

     do { 
      let results = try self.viewContext?.fetch(request)     
      if results?.count == 1 { 
       let recordToUpdate = results![0] 
       recordToUpdate.setValue(newName, forKey: "name") 
       DispatchQueue.main.async { // Here I receive the error when editing goes from CloudKit 
        self.saveViewContext() 
       } 
       handleComplete_RecordEditedInCoreData() 
      } 
     } catch { 
      print(error) 
     } 

} 

Hier sind die anderen verwandten Funktionen:

func saveViewContext() { 
     let context = self.getViewContext() 
     if context.hasChanges { 
      do { 
       try context.save() 
      } catch { 
       // Replace this implementation with code to handle the error appropriately. 
       // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
       let nserror = error as NSError 
       fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
      } 
     } 
    } 

func getViewContext() -> NSManagedObjectContext { 
     return self.persistentContainer.viewContext 
    } 

Alle viewContext Anrufe in meiner App in einem Haupt-Thread gemacht werden. Ich nehme an, dass das zu Fehlern führen kann.

Und der Fehler führt zu saveViewContext Methode. Ich bin mir nicht sicher, aber ich denke, das könnte ein Nebenläufigkeitsproblem sein, aber ich weiß nicht, wie ich es beheben soll.

Wie soll ich meinen Code umschreiben, um diesen Fehler beim Update von CloudKit Record zu vermeiden? Ich habe versucht, alle Anrufe in der Hauptwarteschlange zu umbrechen, aber das hat nicht geholfen.

ich auch die gleiche updateCoreDataRecord() Methode, verwendet, wenn der Benutzer auf dem Gerät Core-Datensatz ändert, und dies verursacht keinen Fehler. Ich erhalte nur diesen Fehler, wenn ich Änderungen von CloudKit im operation.recordChangedBlock {} erhalte, wo ich Core Data Updates für einen Record mache.

Antwort

0

Wird diese Methode im Hauptthread ausgelöst? Wenn nicht, müssen Sie alle Core Data-Arbeiten in den Hauptthread verschieben, wenn Sie mit dem viewContext arbeiten, nicht nur mit dem Speichern.

Verwandte Themen