我有一个具有手动定义的类。可以在下面看到。
class NewsFeedResponse: NSManagedObject, Cachable {
@NSManaged var id: String?
@NSManaged var cachedAt: Date?
@NSManaged var featuredArticles: Array<FeaturedArticle>?
@NSManaged var learningMaterials: Array<LearningMaterial>?
enum CodingKeys: String, CodingKey {
case featuredArticles
case learningMaterials
}
override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) {
super.init(entity: entity, insertInto: context)
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
super.init(entity: NewsFeedResponse.entity(), insertInto: CoreDataManager.shared.getContext())
do {
self.cachedAt = Date()
self.featuredArticles = try container.decode(Array<FeaturedArticle>?.self, forKey: .featuredArticles)
self.learningMaterials = try container.decode(Array<LearningMaterial>?.self, forKey: .learningMaterials)
} catch {
print(error)
}
}
func encode(to encoder: Encoder) throws { }
}
featureArticles和learningMaterials在coredata模型中的两个方向上都具有一对多的关系。如果将Array更改为Set,这不会导致使用Set的唯一问题是它们的排列顺序不像Arrays,因此数据顺序不一致。值得注意的是,我没有用@objc标记该类,因为如果我这样做,该对象似乎就不会持久保存,这就是为什么它没有此标记的原因。
此外,每当我现在运行应用程序时,都会发生以下崩溃。
2019-08-20 09:51:07.265011+0100 [89304:24860419] [error] error: Property 'featuredArticles' is marked copy on class ‘XXXXX.NewsFeedResponse'. Cannot generate a copying setter method for NSManagedObject's to-one relationship.
CoreData: error: Property 'featuredArticles' is marked copy on class 'XXXXXXX.NewsFeedResponse'. Cannot generate a copying setter method for NSManagedObject's to-one relationship.
2019-08-20 09:51:07.265235+0100 XXXXXXX[89304:24860419] -[XXXXXXX.NewsFeedResponse setFeaturedArticles:]: unrecognized selector sent to instance 0x600002d8afd0
2019-08-20 09:51:07.270994+0100 XXXXXXX[89304:24860419] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[XXXXXXX.NewsFeedResponse setFeaturedArticles:]: unrecognized selector sent to instance 0x600002d8afd0'
我不确定如何编写coredata抱怨的这些设置方法。
答案 0 :(得分:0)
对多关系必须声明为(最好是非可选的)Set
或NSSet
@NSManaged var featuredArticles: Set<FeaturedArticle>
@NSManaged var learningMaterials: Set<LearningMaterial>
如果您需要订单,则有以下三种选择:
NSOrderedSet
(没有Swift等效项),然后选中模型中的排列:已排序复选框。NewsFeedResponse
的文章和材料。