为啥我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据,迅速)
Posted
技术标签:
【中文标题】为啥我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据,迅速)【英文标题】:Why can't I use a relationship in a NSManagedObject subclass computed property? (CoreData, swift)为什么我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据,迅速) 【发布时间】:2016-01-10 23:39:51 【问题描述】:我正在使用 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]
最后一个示例有时会返回正确的数组,有时只返回一个空数组。 我对计算属性中的其他关系尝试了同样的事情,结果是一样的。
这是为什么呢?我有理由不尝试这样做吗?我的第一个示例是有效的解决方法,还是会在以后给我带来问题?我是否应该为此放弃使用计算属性并在需要时重复代码?
提前致谢!
丹尼尔
【问题讨论】:
关系是双向的吗?您如何更新和保存它们? @Wain 我用额外的信息编辑了我的问题。非常感谢您的帮助! @Wain Uhm,我现在无法尝试,但我想我发现问题可能出在 Book-User 关系中。我把一切都搞砸了,我的用户的“selectedBook”关系应该是 To One,而不是 To Many,因为一次只有一本选定的书,然后一本书的用户在创建时不应该被分配,只有用户的 selectedBook应该在从一行中选择一本书时设置。 @Wain 现在我仍然不知道 Book-ReadingSession 关系中的问题是什么,但无论如何,我的问题的答案是我应该能够在我的计算属性中使用关系,对吗?所以我的问题实际上出在其他地方? 是的,你应该这样做。我想知道您是否在某处创建重复的对象。您是否尝试过依次查询所有内容以验证其中的内容? 【参考方案1】:回答我自己的问题,正如 Wain 在 cmets 中指出的那样,我应该能够在计算属性中使用关系,而我的问题实际上出在其他地方。
如果您对详细信息感兴趣,请阅读下一段,但是,长话短说,如果您遇到同样的问题,您应该检查您的关系并确保将它们正确设置为 To One 或 To Many .还要检查您是否将所有属性设置在正确的位置,并且仅在必要时进行。
我编辑了我的问题以删除许多不必要的细节并使其更具可读性,但最终问题是我有一个带有 selectedBook 属性的用户实体,该属性是在用户选择一行时设置的。我已将其设置为 To Many 关系,但用户一次只能选择一本 selectedBook,因此它应该是 To One 关系。此外,当我创建一本书时,我将 user.selectedBook 设置为它,但 selectedBook 属性仅应在用户从一行中选择一本书时设置。所以我一直在设置并尝试在所有正确的时间访问我的一些关系。例如,我试图在用户甚至选择一行之前访问 user.selectedBook,然后它显然返回 nil,这弄乱了许多其他计算属性。现在我修复了所有这些问题,并且可以从计算属性中访问我的所有关系,而不会出现任何问题。
【讨论】:
以上是关于为啥我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据,迅速)的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 ivar 没有在 NSManagedObject 子类上设置
为啥自动创建的 NSManagedObject 子类没有“正确”标题?
Swift 中的 NSManagedObject 子类不能使用自定义访问器?