ios - 为什么我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据, swift )

标签 ios swift core-data nsmanagedobject computed-properties

我正在使用 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/

相关文章:

ios - 为什么不应该将 UIWebView 放在 UIScrollView 中?

ios - swift:如何在两个 UITableViewCell 之间翻转单元格

swift - 当不在闭包中时,传递属于 self 的函数是否会导致保留循环?

ios - 如何使用 Swift 3 获取扫描的条形码照片?

ios - 如何传递给循环调用的 URLSession.shared.dataTask?

iphone - Bundle ID 和 SKU 能否在另一个 iTunes Connect 帐户中重复使用?

ios - 使用 iPhone 接收短信通知

ios - Apple 推送通知仅适用于一台设备

objective-c - CoreData,单独线程上的子 MOC,意外 : error: NULL _cd_rawData but the object is not being turned into a fault

ios - 如何在 xcode 中修复 "Failed to load model named datamodelname"