【发布时间】: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