我在Core Data中有2个实体, Bill
和 Person
. 我有两种关系:
-
Bill
至Person
是一个名为'people'的'To Many'关系 -
反向 - 从
Person
到Bill
是'To One' - 被称为'bill' .
Xcode(以及类)生成的结果是:
Bill
:
extension Bill {
@NSManaged var people: NSSet?
}
Person
:
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
}
}
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
.
我尝试过的解决方案是:
- 从this answer添加此访问者:
@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 回答
啊,我和[这个问题]有类似的问题 . 1我在
Bill
上有一个名为getOwers
的方法,它有一个返回类型的数组,这似乎覆盖了CoreData创建的访问器 . 我把方法改为getOwersArr
,现在一切都很好 . 感谢@ Paulw11指出我正确的方向!我还有许多关系实现为
NSSet
. 我使用如下代码添加/删除对象(没有任何问题):我在iOS 9.3中遇到了与一对多关系类似的问题 .
我通过替换修复它:
group.addToTeams(team) // Crashes on iOS 9.3
有:
team.group = group // This will correctly add team to the set without crashing
基本上不是添加和对象集合使用反向关系 .