ios – 与核心数据的反向关系在向NSSet添加对象时导致崩溃

我在Core Data中有2个实体,一个Bill和Person.我有两种关系:

> Bill to Person是一个’To Many’关系,称为’人’
>反过来 – 从人到比尔是’到一’ – 称为’账单’.

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

法案:

extension Bill {
    @NSManaged var people: NSSet?
}

人:

extension Person {
    @NSManaged var bill: Bill?
}

这是我为将Bill对象添加到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
    }
}

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时,它崩溃了人们?.setByAddingObject(person),错误如下:

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

当我删除从Person到Bill的账单关系时,它运行正常,并且Person被添加到Bill的’people’NSSet中.我可以这样离开,因为我不一定需要这种反向关系,但我已经读过,除非我有充分的理由不这样做,否则最好有反向关系.我也在我的应用程序中与其他关系面对这个问题,所以我会有很多关系而没有反向.

有什么想法有什么不对吗?我的关系不正确吗?一项法案可以有很多人,但一个人只能有一个法案.

我尝试过的解决方案是:

>从this answer添加此访问器:

@NSManaged func addPeopleObject(value:Person)

但我得到错误:

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

>按照其他答案的建议创建NSMutableOrderedSet:

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

…但我得到了相同的原始崩溃消息.

>解开’人’ – 仍然会收到相同的崩溃消息.

任何帮助将不胜感激,谢谢.

最佳答案 啊,我遇到了与[这个问题]类似的问题.
1我在Bill上有一个叫getOwers的方法,它有一个返回类型的数组,这似乎覆盖了CoreData创建的访问器.我把方法改为getOwersArr,现在一切都很好.感谢@ Paulw11指出我正确的方向!

点赞