Ios 向NSSet添加对象时,与核心数据的反向关系会导致崩溃

Ios 向NSSet添加对象时,与核心数据的反向关系会导致崩溃,ios,swift,core-data,nsmanagedobject,relationships,Ios,Swift,Core Data,Nsmanagedobject,Relationships,我在核心数据中有两个实体,一个是账单和个人。我有两种关系: BilltoPerson是一种称为“people”的“对多”关系 从Person到Bill的倒数是“到一”——称为“Bill” Xcode生成的结果(以及类)是: 账单: extension Bill { @NSManaged var people: NSSet? } 人: extension Person { @NSManaged var bill: Bill? } 这是我编写的将Person对象添加到Bill

我在核心数据中有两个实体,一个是
账单
个人
。我有两种关系:

  • Bill
    to
    Person
    是一种称为“people”的“对多”关系
  • Person
    Bill
    的倒数是“到一”——称为“Bill”
Xcode生成的结果(以及类)是:

账单

extension Bill {
    @NSManaged var people: NSSet?
}

extension Person {
    @NSManaged var bill: Bill?
}
这是我编写的将
Person
对象添加到
Bill
NSSet
的方法:

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
    }
}
个人的自定义初始化器是:

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)
,错误如下:

***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u TtCs21\u SwiftDeferredNSArray isEqualToSet::无法识别的选择器已发送到实例0x7fc7ed875cb0'

当我将
账单
关系从
个人
删除到
账单
时,它运行正常,
个人
被添加到
账单
的“人”
NSSet
。我可以这样说,因为我不一定需要这种反向关系,但我已经读到,最好是有一个反向关系,除非我有一个很好的理由不这样做。在我的应用程序中,我也面临着其他关系的问题,因此我会有很多没有相反关系的关系

你知道怎么了吗?我的关系不正确吗?一张
账单
可以有许多
s,但一张
只能有一张
账单

我尝试过的解决方案有:

  • 从以下位置添加此访问者:

    @NSManaged func addPeopleObject(值:Person)

但我得到了一个错误:

由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:“***-[NSSet intersectsSet:]: set参数不是NSSet的

  • 按照其他答案的建议,创建一个
    NSMutableOrderedSet
让mutPeople=NSMutableOrderedSet(数组:(people?.allObjects)!)
mutOwers.addObject(个人)
people=NSSet(数组:mutpeels.array)

…但我得到了同样的,最初的崩溃信息

  • 解包“人”-仍然会收到相同的崩溃消息

非常感谢您的帮助。

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

我还必须将许多关系实现为
NSSet
。我使用如下代码向集合中添加/删除对象(没有任何问题):

let mutableSet = bill.mutableSetValueForKey("people") 

mutableSet.addObject(newPerson)

// (next, save managed object context)

在一对多的关系中,我与iOS 9.3有类似的问题

我通过替换来修复它:

group.addToTeams(团队)//在iOS 9.3上崩溃

与:

team.group=group//这将正确地将团队添加到集合中而不会崩溃


基本上,不要向集合中添加和对象,而是使用相反的关系。

尝试展开
人员
属性。类似于
如果让people=self.people-as?NSSet{self.people=people.setByAddingObject(person)}else{self.people=NSSet(object:person)}
@Paulw11我也会遇到同样的错误:/如果设置断点并查看
people
它是什么类?异常表明Swift正在将其转换为
SWIFTDEREDERNDASARRAY
而不是set@Paulw11隐马尔可夫模型。。。当我打开
人员
并打印其
动态类型
时,它会说它是
\n错误可变表集
,因此它不是一个
数组
,就像错误似乎说的那样,我对为什么必须编写代码来管理关系感兴趣。简单地分配
person.bill=bill
就可以了