How to encode/decode Core Data NSSets with Relationships

I have two classes: Board and Formation. There is a relationship between them - each Formation is assigned a single Board. Multiple formations can be assigned to a board. This relationship is set up in CoreData as well.

I am having trouble using Core Data with Codable to encode that relationship. It throws a bad access error.

I have done my research online, but most of the articles do not touch on relationships. Please advise.


Code Block
public class Board: NSManagedObject, Codable {
  enum CodingKeys: CodingKey {
    case lastEdited, name, notes, song, uniqueId, subFormations
  }
    required convenience public init(from decoder: Decoder) throws {
        guard let context = decoder.userInfo[CodingUserInfoKey.managedObjectContext] as? NSManagedObjectContext else {
          throw DecoderConfigurationError.missingManagedObjectContext
        }
        self.init(context: context)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        do{
        self.lastEdited = try container.decode(Date.self, forKey: .lastEdited)
        self.name = try container.decode(String?.self, forKey: .name)
        self.notes = try container.decode(String?.self, forKey: .notes)
        self.song = try container.decode(String?.self, forKey: .song)
        self.uniqueId = try container.decode(String.self, forKey: .uniqueId)
            self.subFormations = try container.decode(Set<Formation>.self, forKey: .subFormations)
        }   catch{
            print("Error Decoding Board")
        }
}
     public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(lastEdited, forKey: .lastEdited)
        try container.encode(name, forKey: .name)
        try container.encode(notes, forKey: .notes)
       try container.encode(song, forKey: .song)
        try container.encode(uniqueId, forKey: .uniqueId)
        try container.encode(subFormations, forKey: .subFormations)
      }



Code Block
public class Formation: NSManagedObject, Codable {
  enum CodingKeys: CodingKey {
    case name, position, songTime, uniqueId, waitTime, dancers, formationOwner
  }
  required convenience init(from decoder: Decoder) throws {
    guard let context = decoder.userInfo[CodingUserInfoKey.managedObjectContext] as? NSManagedObjectContext else {
      throw DecoderConfigurationError.missingManagedObjectContext
    }
    self.init(context: context)
    let container = try decoder.container(keyedBy: CodingKeys.self)
    self.name = try container.decode(String.self, forKey: .name)
    self.position = try container.decode(Int16.self, forKey: .position)
    self.songTime = try container.decode(Float.self, forKey: .songTime)
    self.uniqueId = try container.decode(String.self, forKey: .uniqueId)
    self.waitTime = try container.decode(Int16.self, forKey: .waitTime)
    self.formationOwner = try container.decode(Board.self, forKey: .formationOwner)
  }
    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(position, forKey: .position)
        try container.encode(songTime, forKey: .songTime)
       try container.encode(uniqueId, forKey: .uniqueId)
        try container.encode(waitTime, forKey: .waitTime)
        try container.encode(formationOwner as Board, forKey: .formationOwner)
      }



Code Block
//Formation Properties
    @NSManaged public var name: String?
    @NSManaged public var position: Int16
    @NSManaged public var songTime: Float
    @NSManaged public var uniqueId: String
    @NSManaged public var waitTime: Int16
    @NSManaged public var dancers: NSSet?
    @NSManaged public var formationOwner: Board


Code Block
//Board Properties
 try container.encode(lastEdited, forKey: .lastEdited)
        try container.encode(name, forKey: .name)
        try container.encode(notes, forKey: .notes)
       try container.encode(song, forKey: .song)
        try container.encode(uniqueId, forKey: .uniqueId)
        try container.encode(subFormations, forKey: .subFormations) //Thread 1: EXC_BAD_ACCESS





I have same question. Did you ever find an answer? I even deleted the NSSet relationship, but still same error: EXC_BAD_ACCESS (code=2, address=0x16f093fe0)
How to encode/decode Core Data NSSets with Relationships
 
 
Q