在ObservableObject中禁用为@Published变量发送事件

时间:2019-12-06 03:37:27

标签: swift swiftui combine

我有问题,UI很难从零更新为某个数字。 问题是在删除所有项目并将新项目添加到数组UI时得到更新 ,因为此数组已标记为 @Published 属性包装。有关问题的更详细说明:

  1. 在第1阶段(在代码快照中标记),从列表中删除项目。
  2. 在这种情况下,UI得到更新,并且UI更新中的计数为零。
  3. 一段时间后,完成提取并将新项目添加到数组中 (第2阶段)。
  4. 然后UI会更新新项目计数。
  5. 问题在于,UI中的计数从零更新到了一些数字。

这是一种为带有@Published属性包装器标记的类成员禁用分发事件的方法吗?

class ItemsProvider: ObservableObject {
    @Published var items: [Item] = []

    func fetchUsing(query: Query, completion: @escaping (Error?) -> Void) {
        self.items.removeAll() // 1. Removing old items.

        query.getDocuments { (result, error) in
            result?.forEach {
                self.items.append(try? $0.data(as: Item.self)) // 2. Adding new items.
            }
            completion(error)
        }
    }
}

1 个答案:

答案 0 :(得分:3)

请勿对items进行部分更新。在设置items之前计算整个新数组。

func fetchUsing(query: Query, completion: @escaping (Error?) -> Void) {
    query.getDocuments { (result, error) in
        self.items = result?.compactMap { try? $0.data(as: Item.self) } ?? []
        completion(error)
    }
}