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
账单
和个人
。我有两种关系:
toBill
是一种称为“people”的“对多”关系Person
- 从
到Person
的倒数是“到一”——称为“Bill”Bill
账单
:
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)
- 按照其他答案的建议,创建一个
: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
就可以了