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?
Haben Sie versucht, einen Haltepunkt an der Löschleitung setzen und wenn die selectedPin zu sehen Überprüfung der imagedata –
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
@AjayReddy keine Ideen? – Pigpocket