У меня есть 2 объекта в данных ядра, a Bill
и Person
. У меня есть два отношения:Обратные отношения с основными данными приводят к сбою при добавлении объекта в NSSet
Bill
кPerson
является «Для многих» отношений под названием «люди»- обратное - от
Person
кBill
является «One'- под названием„Счет“.
Результат, генерируемый 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'
Когда я удалить bill
От Person
до Bill
, он отлично работает, а Person
добавлен к «людям» Bill
NSSet
. Я мог бы оставить это так, потому что мне не обязательно нужны эти обратные отношения, но я читал, что лучше иметь обратную связь, если у меня нет оснований не делать этого. Я также сталкиваюсь с этой проблемой с другими отношениями в своем приложении, поэтому у меня было бы много отношений без их обратного.
Любые идеи, что не так? Являются ли мои отношения неправильными? Один Bill
может иметь много Person
s, но один 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'. Что-то вроде 'если пусть люди = self.people как? NSSet {self.people = people.setByAddingObject (person)} else {self.people = NSSet (object: person)} ' – Paulw11
@ Paulw11 Я получаю ту же ошибку:/ – Daven
Если вы установите точку останова и посмотрите на« людей », что класс это? Исключение указывает, что Swift преобразует его в 'SwiftDeferredNSArray', а не в набор – Paulw11