将对象添加到 NSSet 时与 Core Data 的反向关系导致崩溃

Inverse Relationship with Core Data Causes Crash when Adding Object to NSSet

我在 Core Data 中有 2 个实体,BillPerson。我有两个关系:

Xcode(以及 类)生成的结果是:

Bill:

extension Bill {
    @NSManaged var people: NSSet?
}

Person:

extension Person {
    @NSManaged var bill: Bill?
}

这是我编写的方法,用于将 Person 对象添加到 BillNSSet:

class Bill : NSManagedObject {
...

func addPersonToBill(contact : CNContact){

        let entDesc = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedObjectContext())

// Create Person object with custom initialiser
        let person = Person(contact: contact, entity: entDesc!, insertIntoManagedObjectContext: managedObjectContext())
        print("Got person")

        people = people?.setByAddingObject(person) // CRASHES HERE
    }
}

Person 的自定义初始化器是:

init(contact : CNContact, entity : NSEntityDescription, insertIntoManagedObjectContext context : NSManagedObjectContext?){
        super.init(entity: entity, insertIntoManagedObjectContext: context)
   // I set other properties here using info from the CNContact
    }

但是,当我添加 Person 时,它在 people?.setByAddingObject(person) 处崩溃并出现错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_TtCs21_SwiftDeferredNSArray isEqualToSet:]: unrecognized selector sent to instance 0x7fc7ed875cb0'

当我删除从 PersonBillbill 关系时,它运行正常并且 Person 被添加到 Bill 的 'people' NSSet。我可以这样保留它,因为我不一定需要这种反向关系,但我读到最好有反向关系,除非我有充分的理由不这样做。我的应用程序中的其他关系也面临这个问题,所以如果没有它们的逆关系,我会有很多关系。

有什么问题吗?我的人际关系不正确吗?一个Bill可以有多个Person,但是一个Person只能有一个Bill.

我尝试过的解决方案是:

但我收到错误消息:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSSet intersectsSet:]: set argument is not an NSSet'

let mutPeople = NSMutableOrderedSet(array: (people?.allObjects)!) mutOwers.addObject(person) people = NSSet(array:mutPeople.array)

...但我收到相同的原始崩溃消息。

非常感谢任何帮助,谢谢。

啊,我遇到了与 [this question] 类似的问题。1 我在 Bill 上有一个名为 getOwers 的方法,它有一个 return 类型的数组,这似乎覆盖了 CoreData 创建的访问器。我将方法更改为getOwersArr,现在一切正常。感谢@Paulw11 为我指明了正确的方向!

我也有实现为 NSSet 的对多关系。我 add/delete 使用如下代码反对集合(没有任何问题):

let mutableSet = bill.mutableSetValueForKey("people") 

mutableSet.addObject(newPerson)

// (next, save managed object context)

我在一对多关系中遇到了与 iOS 9.3 类似的问题。

我通过替换修复了它:

group.addToTeams(team) // Crashes on iOS 9.3

与:

team.group = group // This will correctly add team to the set without crashing

基本上不是将对象添加到集合,而是使用反向关系。