我目前正在使用 CoreData 开发 SwiftUI 应用程序。我目前确实在 CoreData 中定义了 2 个实体。
带代码:
extension CoreDataRecipe: Identifiable {
@nonobjc public class func fetchRequest() -> NSFetchRequest<CoreDataRecipe> {
return NSFetchRequest<CoreDataRecipe>(entityName: "CoreDataRecipe")
}
@NSManaged public var recipeName: String
@NSManaged public var startDate: Date
@NSManaged public var uuid: UUID
@NSManaged public var recipeSteps: NSOrderedSet
}
带代码:
extension CoreDataRecipeStep: Identifiable {
@nonobjc public class func fetchRequest() -> NSFetchRequest<CoreDataRecipeStep> {
return NSFetchRequest<CoreDataRecipeStep>(entityName: "CoreDataRecipeStep")
}
@NSManaged public var finishDate: Date?
@NSManaged public var isActiveStep: Bool
@NSManaged public var localStepType: String?
@NSManaged public var stepDuration: Int32
@NSManaged public var uuid: UUID?
var stepType: RecipeStepType {
set {localStepType = newValue.rawValue}
get {RecipeStepType(rawValue: localStepType ?? "") ?? .Vorteig}
}
}
我已经可以使用 ForEach 毫无问题地绕过父项。为此,我使用@ObservedObject。保持 SwiftUI 方式的绑定。
我这样做:
@FetchRequest(entity: CoreDataRecipe.entity(), sortDescriptors: []) var recipes: FetchedResults<CoreDataRecipe>
...
ForEach(recipes) { recipe in
BreadListItem(recipe: recipe)
}
在 BreadListItem 内部,我使用了 @ObservedObject,它的作用就像一个魅力。
@ObservedObject var recipe: CoreDataRecipe
我现在想做的,是按照我的食谱步骤做同样的事情。我的假设是我可以对 NSOrderedSet 中的元素使用相同的 ForEach 来执行此操作,如下所示:
ForEach(recipe.recipeSteps ?? []) { step in
RecipeStepEntryField(step: step)
}
问题在于我不能遍历这些元素,因为 NSOrderedSet 不符合 RandomAccessCollection。当然,我可以将 NSOrderedSet 强制转换为数组,但这会破坏与对象的绑定,不是吗?我只是没有看到如何在保持 CoreData 完整的同时使用 @ObservedObject 实现与集合的绑定。
有人可以在这里帮助我吗?