使用“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多对多关系映射)