首页 文章

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

提问于
浏览
3

我在Core Data中有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 对象添加到 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) 崩溃并出现错误:

***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [_ TtCs21_SwiftDeferredNSArray isEqualToSet:]:无法识别的选择器发送到实例0x7fc7ed875cb0'

当我从 Person 删除 bill 关系到 Bill 时,它运行正常, Person 被添加到 Bill 's '人' NSSet . 我可以这样离开,因为我不知道最好有反向关系,除非我有充分的理由不这样做 . 我也在我的应用程序中与其他关系面临这个问题,所以我会有很多关系,而不是他们的逆 .

有什么想法有什么不对吗?我的关系不正确吗?一个 Bill 可以有多个 Person ,但是一个 Person 只能有一个 Bill .

我尝试过的解决方案是:

@NSManaged func addPeopleObject(value:Person)

但我得到错误:

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

  • 按照其他答案的建议创建 NSMutableOrderedSet

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

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

  • 展开'people' - 仍然会收到相同的崩溃消息 .

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

3 回答

  • 2

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

  • 0

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

    let mutableSet = bill.mutableSetValueForKey("people") 
    
    mutableSet.addObject(newPerson)
    
    // (next, save managed object context)
    
  • 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

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

相关问题