1

我目前正在使用 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

}

RecipeStep 实体

带代码:

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 实现与集合的绑定。

有人可以在这里帮助我吗?

4

1 回答 1

3
于 2020-07-06T22:18:50.680 回答