【发布时间】:2016-04-27 00:30:25
【问题描述】:
我在 Core Data 中有 2 个实体,一个 Bill 和 Person。我有两个关系:
-
Bill到Person是一种称为“人”的“对多”关系 - 倒数 - 从
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'
当我将bill 关系从Person 删除到Bill 时,它运行良好,并且Person 被添加到Bill 的“人”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属性。类似if let people = self.people as? NSSet { self.people = people.setByAddingObject(person) } else { self.people = NSSet(object:person) } -
@Paulw11 我得到同样的错误:/
-
如果设置断点,看看
people是什么类?异常表明 Swift 将其转换为SwiftDeferredNSArray而不是集合 -
@Paulw11 嗯...当我打开
people并打印它的dynamicType它说它是_NSFaultingMutableSet,所以它不是NSArray就像错误似乎说的那样 -
我对您为什么必须编写代码来管理这些关系很感兴趣。只需分配
person.bill=bill就可以了
标签: ios swift core-data nsmanagedobject relationships