2016-04-27 11 views
3

У меня есть 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 к BillNSSet:

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 добавлен к «людям» BillNSSet. Я мог бы оставить это так, потому что мне не обязательно нужны эти обратные отношения, но я читал, что лучше иметь обратную связь, если у меня нет оснований не делать этого. Я также сталкиваюсь с этой проблемой с другими отношениями в своем приложении, поэтому у меня было бы много отношений без их обратного.

Любые идеи, что не так? Являются ли мои отношения неправильными? Один 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)

... но я получаю то же самое, оригинальные аварии сообщения.

  • Развертывание «людей» - все равно получите одно и то же сообщение об аварии.

Любая помощь была бы очень признательна, спасибо.

+0

Попробуйте развернуть свою собственность 'people'. Что-то вроде 'если пусть люди = self.people как? NSSet {self.people = people.setByAddingObject (person)} else {self.people = NSSet (object: person)} ' – Paulw11

+0

@ Paulw11 Я получаю ту же ошибку:/ – Daven

+0

Если вы установите точку останова и посмотрите на« людей », что класс это? Исключение указывает, что Swift преобразует его в 'SwiftDeferredNSArray', а не в набор – Paulw11

ответ

2

У меня была аналогичная проблема с [этот вопрос]. 1 У меня был метод на Bill под названием getOwers, у которого был тип возврата массива, и это, казалось, переопределяло создание CoreData. Я изменил метод на getOwersArr, и теперь все в порядке. Спасибо @ Paulw11 за то, что указали мне в правильном направлении!

0

У меня также есть много отношений, выполненных как NSSet. Добавить/удалить объекты из множества (без каких-либо проблем) с помощью кода, как следующее:

let mutableSet = bill.mutableSetValueForKey("people") 

mutableSet.addObject(newPerson) 

// (next, save managed object context) 
0

У меня была аналогичная проблема с прошивкой 9.3 в отношении один-ко-многим.

Я зафиксировал его путем замены:

group.addToTeams(team) // Crashes on iOS 9.3

с:

team.group = group // This will correctly add team to the set without crashing

В основном вместо добавления и объекта к множеству использовать обратную зависимость.