使用“To Many”关系条目的“.allObjects”时,SwiftUI + Core Data 崩溃

Posted

技术标签:

【中文标题】使用“To Many”关系条目的“.allObjects”时,SwiftUI + Core Data 崩溃【英文标题】:SwiftUI + Core Data crash when using `.allObjects` of a "To Many" relationship entry 【发布时间】:2021-08-02 18:01:31 【问题描述】:

我经常收到带有如下堆栈跟踪的崩溃报告:

0   libobjc.A.dylib                 0x0000000199e6a334 object_getMethodImplementation + 48 (objc-object.h:97)
1   CoreFoundation                  0x00000001853d35a4 _NSIsNSSet + 40 (NSObject.m:381)
2   CoreFoundation                  0x00000001852a6888 -[NSMutableSet unionSet:] + 108 (NSSet_Internal.h:56)
3   CoreData                        0x000000018b4af3b0 -[_NSFaultingMutableSet willReadWithContents:] + 636 (_NSFaultingMutableSet.m:167)
4   CoreData                        0x000000018b53c3a0 -[_NSFaultingMutableSet allObjects] + 32 (_NSFaultingMutableSet.m:340)

我的代码正在执行以下操作,这是在 Core Data 自动生成的类中(我在对该类所做的扩展中使用下面的代码):

if let tasks = tasks?.allObjects as? [Task] 

其中tasks@NSManaged public var tasks: NSSet?,这是核心数据中的“数组”对象(自动生成的)。

任何想法这里有什么问题,可能是核心数据问题本身,SwiftUI + Core Data 出于某种原因。

【问题讨论】:

您能否添加更多上下文,例如为什么tasks 是一个变量而不是直接从一对一对象访问它? Ofc,tasks 是 Core Data 生成的入口类的属性。我已经对该类进行了扩展,这就是我可以直接使用tasks 的方式。 【参考方案1】:

我就是这样做的,作为类扩展中的计算属性,从来没有问题。

var allTasks: [Task] 
tasks?.allObjects as? [Task] ?? [ ]

您可以在里面添加 if let 并进行任何排序或过滤并返回。

【讨论】:

谢谢您,我会尝试看看这是否适用于我的情况,希望它确实有效,因为我仍然不时收到这些错误。最常见的情况是应用在后台运行了几个小时。【参考方案2】:

使用最新的 SwiftUI 3,我已经不再看到这种崩溃了。

最初这正是我认为问题的根源(内部 SwiftUI 问题),事实证明就是这样。

【讨论】:

以上是关于使用“To Many”关系条目的“.allObjects”时,SwiftUI + Core Data 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Django, one-to-many, many-to-many

用 Flask 来写个轻博客 — (M)VC_models 的关系(many to many)

我的 NSManagedObject 有 2 To-Many 关系,但只有一个可以返回正确的类信息

EntityFramework Code-First 简易教程-------一对多

Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)

Join Fetch for One To Many 关系多次返回同一个实体