:
yukarıda belirtilen gibi tasarruf
, ben şöyle
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-one relationship: property = "user"; desired type = User; given type = User;
Benim veri modeli görünüyor hatası alıyorum. Benim durumumda, ünite testleri yaparken de oluyordu. Bu durumda, bir kerede bellekte iki temel veri yığını vardı, biri uygulama koşumuna ve diğeri de çalışan birim testlerim için.
Bunu çözümlemenin ilk ipucu, ayarlandığım nesnenin varlık türünün ilişkinin beklenen varlık türü ile aynı olduğundan emin olmak için ilişki özelliğini ayarlamadan önce bir onaylama hakkı vermekti. Aynı olmalılar ve benim durumumda değillerdi.
Benim durumumda "initiator" adlı Player
ile bire bir ilişkisi olan bir MatchRequest
vardı. Yani benim iddia aşağıdaki benziyordu:
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
yukarıdaki iddia ı argüman duruma neden olur Çekirdek veri kullandığı iddiasına benzeyen şüpheli, hangi başarısız oldu.
Player.entity() öğesini denetlerken, hataya neden olan aynı varlık örneğini döndürür.
Sorunun kökü, Çekirdek Verilerinin temel veri yığınlarında yanlış şekilde paylaşılacak varlıklar için bazı statik özellikler ayarlaması olduğunu düşünüyorum. MyManagedObject.entity() yönteminin çağrılması, bir yığından çağrıldığında doğru şekilde çalışır, ancak diğerinden değil.
Bu nedenle, bu soruna geçici bir çözüm bulmak için Player nesneyi iliştirmek üzere, daha yeni MyManagedObject(context:)
yapıcısından ziyade, eski NSEntityDescription.insertNewObject(...)
API'yi kullanarak varlığı elde ediyorum. Bu, verilen yönetilen nesne bağlamında doğru varlığın kullanılmasını sağlar.
Yani, özetlemek gerekirse:
// 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
Bunu çözmek mi? – Voltron