在 SwiftUI 主体中出错的子上下文上创建核心数据实体

Posted

技术标签:

【中文标题】在 SwiftUI 主体中出错的子上下文上创建核心数据实体【英文标题】:Created Core Data Entity on child context faulted in SwiftUI body 【发布时间】:2021-10-21 13:41:09 【问题描述】:

为什么我不能在视图主体中使用这个 draft 对象?

我也试过了:

将 Draft 设置为 State 对象,作为 WrappedValue 传入实体。 将mainQueueConcurrencyType 用于子上下文
extension NSManagedObjectContext 
    public func newChildContext() -> NSManagedObjectContext 
        let moc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
        moc.parent = self
        return moc
    


struct InternalContentView: View 
    private var context: NSManagedObjectContext

    @State private var draft: PlayerEntity

    init(context: NSManagedObjectContext) 
        self.context = context

        let childContext = context.newChildContext()
        draft = PlayerEntity.create(context: childContext)

        print("draft: \(draft)")
        print("draft id: \(draft.id?.uuidString ?? "unknown id")")
        print("draft is faulted: \(draft.isFault)")
    

    var body: some View 
        printv("draft: \(draft)")
        printv("draft id: \(draft.id?.uuidString ?? "unknown id")")
        printv("draft is faulted: \(draft.isFault)")
        Text("")
    

输出是:

draft: <PlayerEntity: 0x600001de6170> (entity: PlayerEntity; id: 0x600003e4fc60 <x-coredata:///PlayerEntity/t54BF6346-6299-479F-AD02-AC61AC056CCF2>; data: 
    email = nil;
    games =     (
    );
    id = "51BDEE17-DCA4-4EB9-8A56-0780ACFF55B3";
    "name_" = nil;
    teams =     (
    );
)
draft id: 51BDEE17-DCA4-4EB9-8A56-0780ACFF55B3
draft is faulted: false

draft: <PlayerEntity: 0x600001de6170> (entity: PlayerEntity; id: 0x600003e4fc60 <x-coredata:///PlayerEntity/t54BF6346-6299-479F-AD02-AC61AC056CCF2>; data: <fault>)
draft id: unknown id
draft is faulted: true

【问题讨论】:

可能是因为子上下文只存在于init中,所以改为属性。 谢谢!请在下面回答,我会接受的! 【参考方案1】:

现在您的子上下文仅存在于 init 中,但您也需要在外部访问它(或者至少在您调用 save() 之前)

所以改为属性

struct InternalContentView: View 
    private var context: NSManagedObjectContext
    private var childContext: NSManagedObjectContext
    ...
  
    init() 
        self.context = context
        childContext = context.newChildContext()

【讨论】:

以上是关于在 SwiftUI 主体中出错的子上下文上创建核心数据实体的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 应用程序中上下文保存的核心数据 Objective-C 异常

ios/objective-c:保存核心数据时出错

NSManagedObjectContext - 导致死锁的子上下文

从不同的文件 SwiftUI 调用核心数据对象

Swift:在后台同步核心数据对象

在 Xcode11 Beta 4 中将 String(format: , args) 与 SwiftUI 一起使用时出错