在 SwiftUI 主体中出错的子上下文中创建了核心数据实体
Created Core Data Entity on child context faulted in SwiftUI body
为什么我不能在视图主体中使用这个 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
中,但您也需要在外部访问它(或者更确切地说,至少在您对其调用 save()
之前)
所以改成 属性
struct InternalContentView: View {
private var context: NSManagedObjectContext
private var childContext: NSManagedObjectContext
...
init() {
self.context = context
childContext = context.newChildContext()
为什么我不能在视图主体中使用这个 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
中,但您也需要在外部访问它(或者更确切地说,至少在您对其调用 save()
之前)
所以改成 属性
struct InternalContentView: View {
private var context: NSManagedObjectContext
private var childContext: NSManagedObjectContext
...
init() {
self.context = context
childContext = context.newChildContext()