在 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 异常
NSManagedObjectContext - 导致死锁的子上下文
在 Xcode11 Beta 4 中将 String(format: , args) 与 SwiftUI 一起使用时出错