One to many CoreData relationships cannot be accessed when an object is loaded

I created a dataModel where I have a task. This task has several variables, but also has a one-to-many event link. These events can be like adding images or comments, and therefore there can be many events for one task. I linked them as shown below:

enter image description here

Entity files are also configured:

import CoreData class Task: NSManagedObject { @NSManaged var area : Area @NSManaged var pictures : [TaskPicture] @NSManaged var events : [Event] @NSManaged var requestedByDept : NSString? @NSManaged var requestedByUser : NSString? @NSManaged var workloadDept : NSString? @NSManaged var detailDescription : NSString? @NSManaged var status : NSString @NSManaged var uniqueId : NSString? @NSManaged var isActive : NSNumber @NSManaged var created : NSDate? @NSManaged var modified : NSDate? @NSManaged var thumbnail : NSData? } 

and

 import CoreData class Event: NSManagedObject { @NSManaged var task : Task @NSManaged var actionBy : NSString? @NSManaged var detailDescription : NSString? @NSManaged var status : NSString @NSManaged var uniqueId : NSString? @NSManaged var isActive : NSNumber @NSManaged var created : NSDate? @NSManaged var modified : NSDate? @NSManaged var type : NSString } 

To me, all this looks right, but I could be wrong. Then I retrieve all the tasks in one of my viewControllers

 var fetchedResultsController: NSFetchedResultsController { if _fetchedResultsController != nil { return _fetchedResultsController! } let fetchRequest = NSFetchRequest() let entity = NSEntityDescription.entityForName("Task", inManagedObjectContext: self.managedObjectContext) fetchRequest.entity = entity fetchRequest.fetchBatchSize = 20 let sortDescriptor = NSSortDescriptor(key: "created", ascending: false) fetchRequest.sortDescriptors = [sortDescriptor] let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil) aFetchedResultsController.delegate = self _fetchedResultsController = aFetchedResultsController var error: NSError? = nil if !_fetchedResultsController!.performFetch(&error) { println("Unresolved error \(error)") abort() } return _fetchedResultsController! } 

I can assure you that managedObjectContext is both updated and correctly passed. The problem occurs when I try to access an array of events. I take each of the tasks using

 let foundTask : Task = self.fetchedResultsController.objectAtIndexPath(indexPath) as Task 

using cellForRowAtIndexPath, as in tableView. This works again, but then when I try let event = foundTask.events[0] or something similar, I get an error message with the message

 -[_NSFaultingMutableSet objectAtIndex:]: unrecognized selector sent to instance 0x17022e9c0 

I tried both listing the array as NSArray and using functions like .firstObject and also put it in an NSSet, but it never allows me to access events. It seems that during the execution of tasks, events do not occur, which leads to a data failure. I would expect him to receive events when I need them, but again, this is not so. Sorry for the long post, but I wanted to include as much information as I felt that you would need to help me. Please ask if you need more information and I will try to answer as quickly as possible.

thanks a lot

+6
source share
1 answer

The A (unordered) to-many relationship in Core Data is represented as an NSSet , not an array, so the property should be declared as

 @NSManaged var events: NSSet 

To convert a set to an array, use allObjects :

 let events = foundTask.events.allObjects as [Event] 

Note that Xcode can subclass managed objects for you (Editor -> Create NSManagedObject Subclass ...), which I would recommend avoiding this kind of error.

+12
source

Source: https://habr.com/ru/post/973707/


All Articles