:
상기와 같은 저장
, 나는 다음과 같이
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-one relationship: property = "user"; desired type = User; given type = User;
내 데이터 모델이 보이는 오류가 발생합니다. 제 경우에는 단위 테스트를 실행하는 동안 일어났습니다. 이 경우 한 번에 두 개의 핵심 데이터 스택이 메모리에 있었고 하나는 응용 프로그램 하네스 용이고 다른 하나는 내 단위 테스트 용이었습니다.
이 문제를 해결하는 첫 번째 단서는 관계 속성을 설정하기 전에 어설 션을 설정하여 내가 설정 한 개체의 엔터티 유형이 관계의 예상 엔터티 유형과 동일한 지 확인해야했습니다. 그들은 동일해야하고, 나의 경우에는 그렇지 않았습니다.
필자의 경우 MatchRequest
은 "개시 자"라는 Player
과 일대일 관계가 있습니다. 그래서 내 주장은 다음과 같이 보았다 :
let player = try Player.findLocal(for: matchRequest.initiator, in: moc, createIfMissing: true)
let expectedEntity = self.entity.relationshipsByName["initiator"]!.destinationEntity!
assert(player!.entity === expectedEntity, "Player returned doesn't have the same entity type")
self.initiator = player
위의 주장은 내가 인수 예외가 발생 코어 데이터에 의해 사용되는 주장과 유사 의심되는 실패했습니다.
Player.entity()를 검사 할 때 오류의 원인이 된 엔티티 인스턴스가 반환됩니다.
저는 핵심 데이터가 핵심 데이터 스택에서 잘못 공유되는 엔티티의 일부 정적 속성을 설정하고 있다는 것이 문제의 근본이라고 생각합니다. MyManagedObject.entity()를 호출하면 한 스택에서 호출 될 때 올바르게 작동하지만 다른 스택에서는 호출되지 않습니다.
그래서이 문제를 해결하기 위해 관계에 넣기 위해 Player 객체를 만들 때 새로운 생성자가 아닌 이전 NSEntityDescription.insertNewObject(...)
API를 사용하여 엔티티를 가져옵니다. 이렇게하면 주어진 관리 객체 컨텍스트에 올바른 엔티티가 사용됩니다.
그래서, 다시 정리해 보면 :
이
// SOMETIMES FAILS if you have more than one core data stack:
result = Player(context: managedObjectContext)
// ALWAYS WORKS:
result = NSEntityDescription.insertNewObject(forEntityName: "Player", into: managedObjectContext) as? Player
당신이이 문제를 해결 했습니까? – Voltron