我正在使用 CoreData,并且有一个 Book 实体和一个 ReadingSession 实体。每本书都有许多阅读 session 。
如果我将此计算属性添加到 Book 类,它就会起作用:
var sessions: [ReadingSession] {
let request = NSFetchRequest(entityName: "ReadingSession")
let predicate = NSPredicate(format: "book = %@", self)
request.predicate = predicate
return try! DataController.sharedInstance.managedObjectContext.executeFetchRequest(request) as! [ReadingSession]
}
但是如果我添加这个,它不会:
var sessions: [ReadingSession] {
return readingSession?.allObjects as! [ReadingSession]
}
最后一个示例有时返回正确的数组,有时仅返回空数组。 我对计算属性内的其他关系尝试了同样的操作,结果是相同的。
这是为什么呢?我有什么理由不应该尝试这样做吗?我的第一个示例是有效的解决方法,还是会在以后给我带来问题?我是否应该为此放弃使用计算属性并在需要时重复代码?
提前致谢!
丹尼尔
最佳答案
回答我自己的问题,正如 Wain 在评论中指出的那样,我应该能够在计算属性中使用关系,而我的问题实际上在其他地方。
如果您对详细信息感兴趣,请阅读下一段,但是,长话短说,如果您遇到同样的问题,您应该检查您的关系并确保将它们正确设置为“一对一”或“一对多” 。另请检查您是否仅在必要时才将所有属性设置在正确的位置。
我编辑了我的问题以删除许多不必要的细节并使其更具可读性,但最终问题是我有一个带有 selectedBook 属性的 User 实体,该属性是在用户选择一行时设置的。我已将其设置为“一对多”关系,但用户一次只能选择一本,因此应该是“一对一”关系。另外,当我创建一本书时,我将 user.selectedBook 设置为它,但是仅当用户从行中选择一本书时才应设置 selectedBook 属性。因此,我在适当的时间设置并尝试建立一些关系。例如,我尝试在用户选择一行之前访问 user.selectedBook,然后它显然返回 nil,这搞乱了许多其他计算属性。现在我解决了所有问题,并且可以毫无问题地从计算属性中访问所有关系。
关于ios - 为什么我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据, swift ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33098977/