如何将 FetchedResults 作为绑定传递

How to pass FetchedResults as Binding

如何将 FetchedResults<CDItem> 作为 Binding 映射并传递给作为 UIKit 包装器的内部视图,以避免在外部更改时重新创建内部视图?

简单示例:

struct CollectionView: UIViewRepresentable {
    @Binding 
    var items: [Item] // array of structs which are core data entities representation

    ...
}

struct ItemsView: View {
    @FetchRequest(fetchRequest: CDItem.fetchReuqest)
    var items: FetchedResults<CDItem>

    var body: some View {
        CollectionView(items: /* ??? */)
    }
}

我的第一个想法 - 在内部制作一些带有 NSFetchedResultsControllerObservableObject 并使用 NSFetchedResultsControllerDelegate 更新一些 @Published 变量,然后使用简单的方法将其转换为绑定。但是我想用 @FetchRequest

这样的糖

这有点棘手而且不太优雅:

extension FetchedResults {
    var binding: Binding<FetchedResults> {
        return Binding {
            return self
        } set: { newValue, transaction in
            //your code to save/update your entities
        }
    }
}

Binding基本上就是一个可以设置和读取的变量。所以要制作一个你只需要指定它的 setter 和 getter。鉴于您无法直接为 FetchedResults 设置新值,您需要提供一个自定义值。

如果您恢复到 @Published 方法,您也可以检查

@Binding 根据定义是 two-way 连接 @FetchRequestNSFetchedResultsController 不是 two-way.

如果您需要从商店items转转,请使用

let items: [CDItem]

let items: [Item] 

如果你在抽象。

影响 @FetchRequestNSFetchedResultsController 的唯一方法是对商店进行更改。他们总是在倾听。