ios - CoreData 无法生成 getter 和 setter
问题描述
我有一个有手动定义的类。这可以在下面看到。
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 { }
}
在 coredata 模型中,featuredArticles 和 learningMaterials 在两个方向上都具有一对多的关系。如果我将 Array 更改为 Set,这不会崩溃,使用 Set 的唯一问题是它们不像数组那样排序,因此数据的顺序不一致。还值得注意的是,我没有用@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 抱怨的这些设置器。
解决方案
必须将一对多关系声明为(首选非可选)Set
或NSSet
@NSManaged var featuredArticles: Set<FeaturedArticle>
@NSManaged var learningMaterials: Set<LearningMaterial>
如果您需要订购,有以下三种选择:
- 将这两种类型声明为
NSOrderedSet
(没有等效的 Swift)并选中模型中的Arrangement: Ordered复选框。 - 添加计算属性或方法以返回排序数组。
NewsFeedResponse
使用适当的谓词和排序描述符获取特定的文章和材料。
推荐阅读
- flutter - 当我尝试将一个列表分配给一个列表时,为什么 .add() 方法不起作用
- javascript - 从 Chrome 获取包含更改的 PDF
- javascript - 将对象数组变成有组织的对象 - javascript
- python - Python在离散数据上查找局部最大值和最小值
- python - 如何让这段代码更快地找到大数的自然除数?
- c++ - (no match for operator[])//C++ 在我尝试在我的函数上使用数组时向我显示该错误
- authentication - 用于 R 身份验证的 Rtweet 包:错误 401
- python - 如何将 .csv 文件中的特定列加载到二维数组中?Python
- ios - React Native iOS - CocoaPods 找不到 Flipper-Folly 的兼容版本,它们需要更高的最小部署目标
- python - 是否可以从 python websocket 读取并写入 kafka 主题?