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

时间:2016-04-27 00:30:26

标签: ios swift core-data nsmanagedobject relationships

我在核心数据中有2个实体,BillPerson。我有两种关系:

  • BillPerson是一个名为'people'的“To Many”关系
  • 反之 - 从PersonBill是'To One' - 称为'bill'。

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

Bill

extension Bill {
    @NSManaged var people: NSSet?
}

Person

extension Person {
    @NSManaged var bill: Bill?
}

这是我为Person的{​​{1}} 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'而终止应用程序,原因:' - [_ TtCs21_SwiftDeferredNSArray   isEqualToSet:]:无法识别的选择器发送到实例0x7fc7ed875cb0'

当我删除从billPerson的{​​{1}}关系时,它运行正常并且Bill已添加到Person的'人'中Bill。我可以这样离开,因为我不一定需要这种反向关系,但我已经读过,除非我有充分的理由不这样做,否则最好有反向关系。我也在我的应用程序中遇到了这个问题与其他关系,所以我会有很多关系而没有反向。

任何想法有什么不对?我的关系不正确吗?一个NSSet可以包含多个Bill个,但一个Person只能有一个Person

我尝试的解决方案是:

但我收到错误:

  

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

  • 按照其他答案的建议创建@NSManaged func addPeopleObject(value:Person)

NSMutableOrderedSet

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

  • 解开'人' - 仍然会收到相同的崩溃讯息。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我还有许多关系实现为NSSet。我使用以下代码添加/删除对象(没有任何问题):

let mutableSet = bill.mutableSetValueForKey("people") 

mutableSet.addObject(newPerson)

// (next, save managed object context)

答案 2 :(得分:0)

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

我通过替换:

来修复它

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

使用:

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

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