2017-12-19 6 views
0

Meine app NSManagedObjects genannt "Pin", die enthalten die folgenden Eigenschaften zu löschen sollten:(Cocoa Fehler 1570), "NSValidationErrorKey" Fehler

@NSManaged public var imageData: NSData? 
@NSManaged public var imageURL: String? 
@NSManaged public var title: String? 
@NSManaged public var pin: Pin? 

... aber ich den Fehler bekommen:

Die imageData -Eigenschaft wird als optional festgelegt, daher bin ich etwas verwirrt, warum Core Data nicht gelöscht werden kann.

ist die didSelect Funktion, die die Löschung ausführt:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { 

    if !isEditing { 
     do { 
      let pinAnnotation = view.annotation as! PinAnnotation 
      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Pin") 
      let predicate = NSPredicate(format: "latitude == %@ AND longitude == %@", argumentArray: [pinAnnotation.coordinate.latitude, pinAnnotation.coordinate.longitude]) 
      fetchRequest.predicate = predicate 
      let pins = try CoreDataStack.sharedInstance().context.fetch(fetchRequest) as? [Pin] 
      selectedPin = pins![0] 
     } catch let error as NSError { 
      print("failed to get pin by object id") 
      print(error.localizedDescription) 
      return 
     } 
     self.performSegue(withIdentifier: "collectionViewSegue", sender: self) 
    } else { 
     mapView.removeAnnotation(view.annotation!) 
     if let selectedPin = selectedPin { 
      CoreDataStack.sharedInstance().context.delete(selectedPin) 
     } 
     CoreDataStack.sharedInstance().saveContext() 
     return 
    } 
} 

Mein Stift Klasse:

convenience init(latitude: Double, longitude: Double, context: NSManagedObjectContext) { 
    if let entity = NSEntityDescription.entity(forEntityName: "Pin", in: context) { 
     self.init(entity: entity, insertInto: context) 
     self.latitude = latitude 
     self.longitude = longitude 
    } else { 
     fatalError("Unable to find entity name") 
    } 
} 

Pin Eigenschaften Erweiterungen:

extension Pin { 

@nonobjc public class func fetchRequest() -> NSFetchRequest<Pin> { 
    return NSFetchRequest<Pin>(entityName: "Pin") 
} 

@NSManaged public var latitude: Double 
@NSManaged public var longitude: Double 
@NSManaged public var images: NSSet? 

}

.. .ein d Instanziierung des Pin NSManagedObject:

@objc func handleLongPress(_ gestureRecognizer : UIGestureRecognizer) { 
    if gestureRecognizer.state != .began { return } 
    print("Tap gesture recognized") 

    // Create the annotation 
    let touchPoint = gestureRecognizer.location(in: mapView) 
    let newCoordinate = self.mapView.convert(touchPoint, toCoordinateFrom:self.mapView) 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = newCoordinate 

    // Initialize NSManagedObject 'Pin' with properties 
    selectedPin = Pin(context: CoreDataStack.sharedInstance().context) 
    selectedPin?.latitude = annotation.coordinate.latitude 
    selectedPin?.longitude = annotation.coordinate.longitude 

    if let selectedPin = selectedPin { 
     let pinAnnotation = PinAnnotation(objectID: selectedPin.objectID, title: nil, subtitle: nil, coordinate: annotation.coordinate) 
     mapView.addAnnotation(pinAnnotation) 

     FlickrClient.sharedInstance().getImagesFromFlickr(pin: selectedPin, context: CoreDataStack.sharedInstance().context, page: 1) { (images, error) in 

      guard error == nil else { 
       print("There was an error get images objects") 
       return 
      } 

      if let images = images { 
       for image in images { 
        image.pin = selectedPin 
       } 
       performUIUpdatesOnMain { 
        self.images = images 
        CoreDataStack.sharedInstance().saveContext() 
       } 
      } 
     } 
    } 
    print("The context has changes: \(CoreDataStack.sharedInstance().context.hasChanges)") 
    CoreDataStack.sharedInstance().saveContext() 

} 

Vorschläge?

+0

Haben Sie versucht, einen Haltepunkt an der Löschleitung setzen und wenn die selectedPin zu sehen Überprüfung der imagedata –

+0

gefüllt hat @AjayReddy ich das tat. Tatsächlich setze ich alle Inhalte und Einstellungen zurück, um sicherzustellen, dass ich zuerst alle vorhandenen Daten gelöscht habe. Für den ersten Pin tippe ich im Bearbeitungsmodus, um zu löschen, es funktioniert einwandfrei. Der Inhalt von selectedPin bei meinem Versuch, einen zweiten Pin zu löschen, ist jedoch -via print statement: ( (Objekt: Pin; id: 0xd000000000240000 ; Daten: ) – Pigpocket

+0

@AjayReddy keine Ideen? – Pigpocket

Antwort

0

Ich löste dieses Problem, indem sie eine Instanz meiner Sparfunktion eliminiert:

CoreDataStack.sharedInstance().saveContext() 

am unteren Rand meiner handleLongPress Funktion. Dies wurde vor dem Zuweisen von Bildern zu der lokalen Variablen in meinem Ansichtscontroller aufgerufen. Der saveContext() musste nur innerhalb der Funktion performUIUpdatesOnMain (meine GCD async-Methode) aufgerufen werden.

Dieser Code in derselben Klasse war auch nicht notwendig:

for image in images { 
       image.pin = selectedPin 
      } 
Verwandte Themen