为什么我不能在NSManagedObject子类计算属性中使用关系? (CoreData,swift)

时间:2015-10-13 09:27:43

标签: ios swift core-data nsmanagedobject computed-properties

我使用的是CoreData,我有一个Book实体和一个ReadingSession实体。每本书都有很多阅读会。

如果我将此计算属性添加到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]
}

最后一个示例有时返回正确的数组,有时只返回一个空数组。 我尝试了与计算属性中的其他关系相同的事情,结果是相同的。

为什么?我不应该尝试这样做吗?我的第一个例子是一个有效的解决方法,还是会在以后引起我的问​​题?我应该放弃使用计算属性,只需在需要时重复代码吗?

提前致谢!

丹尼尔

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,正如Wain在评论中指出的那样,我应该能够在计算属性中使用关系,而我的问题实际上是在其他地方。

如果你对细节感兴趣,请阅读下一段,但是,长话短说,如果你遇到同样的问题,你应该调查你的人际关系并确保它们被正确设置为To One或To Many 。还要检查您是否在适当的位置设置了所有属性,并且仅在必要时进行。

我编辑了我的问题以删除大量不必要的细节并使其更具可读性,但最终问题是我有一个User实体具有selectedBook属性,该属性是在用户选择行时设置的。我把它设置为To Many关系,但用户一次只能选择一个,所以它应该是一个To To关系。此外,当我创建一本书时,我将user.selectedBook设置为它,但只有当用户从一行中选择一本书时才应设置selectedBook属性。所以我正在设置并试图在适当的时候访问我的一些关系。我试图在用户甚至选择一行之前访问user.selectedBook,然后它显然返回了nil,这搞砸了许多其他计算属性。现在我修复了所有这些,并且我能够从计算属性中访问我的所有关系而没有任何问题。