将对象添加到 NSSet 时与 Core Data 的反向关系导致崩溃
Inverse Relationship with Core Data Causes Crash when Adding Object to NSSet
我在 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)
处崩溃并出现错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_TtCs21_SwiftDeferredNSArray
isEqualToSet:]: unrecognized selector sent to instance 0x7fc7ed875cb0'
当我删除从 Person
到 Bill
的 bill
关系时,它运行正常并且 Person
被添加到 Bill
的 'people' NSSet
。我可以这样保留它,因为我不一定需要这种反向关系,但我读到最好有反向关系,除非我有充分的理由不这样做。我的应用程序中的其他关系也面临这个问题,所以如果没有它们的逆关系,我会有很多关系。
有什么问题吗?我的人际关系不正确吗?一个Bill
可以有多个Person
,但是一个Person
只能有一个Bill
.
我尝试过的解决方案是:
从 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(person)
people = NSSet(array:mutPeople.array)
...但我收到相同的原始崩溃消息。
- 展开 'people' - 仍然收到相同的崩溃消息。
非常感谢任何帮助,谢谢。
啊,我遇到了与 [this question] 类似的问题。1 我在 Bill
上有一个名为 getOwers
的方法,它有一个 return 类型的数组,这似乎覆盖了 CoreData 创建的访问器。我将方法更改为getOwersArr
,现在一切正常。感谢@Paulw11 为我指明了正确的方向!
我也有实现为 NSSet
的对多关系。我 add/delete 使用如下代码反对集合(没有任何问题):
let mutableSet = bill.mutableSetValueForKey("people")
mutableSet.addObject(newPerson)
// (next, save managed object context)
我在一对多关系中遇到了与 iOS 9.3 类似的问题。
我通过替换修复了它:
group.addToTeams(team) // Crashes on iOS 9.3
与:
team.group = group // This will correctly add team to the set without crashing
基本上不是将对象添加到集合,而是使用反向关系。
我在 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)
处崩溃并出现错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_TtCs21_SwiftDeferredNSArray isEqualToSet:]: unrecognized selector sent to instance 0x7fc7ed875cb0'
当我删除从 Person
到 Bill
的 bill
关系时,它运行正常并且 Person
被添加到 Bill
的 'people' NSSet
。我可以这样保留它,因为我不一定需要这种反向关系,但我读到最好有反向关系,除非我有充分的理由不这样做。我的应用程序中的其他关系也面临这个问题,所以如果没有它们的逆关系,我会有很多关系。
有什么问题吗?我的人际关系不正确吗?一个Bill
可以有多个Person
,但是一个Person
只能有一个Bill
.
我尝试过的解决方案是:
从 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(person)
people = NSSet(array:mutPeople.array)
...但我收到相同的原始崩溃消息。
- 展开 'people' - 仍然收到相同的崩溃消息。
非常感谢任何帮助,谢谢。
啊,我遇到了与 [this question] 类似的问题。1 我在 Bill
上有一个名为 getOwers
的方法,它有一个 return 类型的数组,这似乎覆盖了 CoreData 创建的访问器。我将方法更改为getOwersArr
,现在一切正常。感谢@Paulw11 为我指明了正确的方向!
我也有实现为 NSSet
的对多关系。我 add/delete 使用如下代码反对集合(没有任何问题):
let mutableSet = bill.mutableSetValueForKey("people")
mutableSet.addObject(newPerson)
// (next, save managed object context)
我在一对多关系中遇到了与 iOS 9.3 类似的问题。
我通过替换修复了它:
group.addToTeams(team) // Crashes on iOS 9.3
与:
team.group = group // This will correctly add team to the set without crashing
基本上不是将对象添加到集合,而是使用反向关系。