我在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指出我正确的方向!