【问题标题】:NSManagedObject property isn't being set correctly when initializedNSManagedObject 属性在初始化时未正确设置
【发布时间】:2021-09-29 07:59:36
【问题描述】:

我有一个核心日期对象,我在我的辅助视图之一的便利初始化中创建。当我加载应用程序时,这个初始化正在运行(我不明白,因为视图没有显示,但这不是真正的问题)。

我的问题是我的核心数据对象上的属性locations 在加载应用程序时返回Optional(Set([]))。然后将Optional(Set([])) 分配给初始化程序中的@Published 属性。然后当我稍后比较两者时,@Published = Optional(Set([]))locations = nil

WorkItemViewModel.swift

@Published var locations: Set<Location>?

convenience init(viewContext: NSManagedObjectContext) {
    let childObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    childObjectContext.parent = viewContext
    self.init(workItem: WorkItem(insertIntoManagedObjectContext: childObjectContext), viewContext: viewContext)
}

init(workItem: WorkItem, viewContext: NSManagedObjectContext) {
    self.viewContext = viewContext
    self.workItem = workItem
    self.locations = workItem.locations
}

如您所见,我在子上下文中创建对象,因此它不会显示在其他视图中。

这个方便的 init 创建对象,然后调用常规 init,它会加载带有对象相关信息的 @Published 属性。

我还在我调用的实际对象中创建了一个方便的 init 来创建对象并使用默认值加载它。这是我将locations 设置为零的地方:

WorkItem+CoreDataClass.swift

// wrapper around the actual property to easily set it
var locations: Set<Location>? {
    get { return locationsValue as? Set<Location> }
    set { locationsValue = newValue as NSSet? }
}

convenience init(title: String = "", category: CategoryType = .general, dueDate: Date = Date(), frequency: FrequencyType = .oneTime, locations: Set<Location>? = nil, notes: String = "", insertIntoManagedObjectContext context: NSManagedObjectContext!) {
    let entity = NSEntityDescription.entity( forEntityName: "WorkItem", in: context)!
    self.init(entity: entity, insertInto: context)
    self.title = title
    self.category = category
    self.dueDate = dueDate
    self.frequency = frequency
    self.locations = locations
    self.notes = notes
}

我不确定这里发生了什么。我知道我可以在视图模型中将 @Published 属性默认为 nil,但我想将默认值全部保存在对象的一个​​位置。

我已经检查过了,实际位置属性在我加载视图之前不会设置为 nil。

换句话说:

加载应用程序->查看初始化运行->对象属性将@published属性设置为Optional(Set([]))->显示视图->对象属性设置为nil

【问题讨论】:

  • 也许更好地处理这个问题的一种方法是使包装器属性非可选,以便您始终使用空集?

标签: ios swift xcode core-data swiftui


【解决方案1】:

我怀疑问题在于您的childObjectContext 仅存在于初始化代码的范围内。一旦 init 完成,childObjectContext 连同它所拥有的关于注册对象的所有信息一起被销毁。因此你的对象的属性恢复为零。

在 WorkItemViewModel 中保留对 childObjectContext 的引用作为 var。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多