【问题标题】:Disable sending events for @Published variables in the ObservableObject在 ObservableObject 中禁用 @Published 变量的发送事件
【发布时间】:2019-12-06 03:37:27
【问题描述】:

我有问题,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)
        }
    }
}

【问题讨论】:

  • 一种可能的方式是,您将数据“首先”存储在另一个地方(可能直到全部加载完毕),然后在您希望更新 UI 时将其填充到您发布的变量中......

标签: swift swiftui combine


【解决方案1】:

不要对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)
    }
}

【讨论】:

    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 2020-03-02
    • 2021-10-14
    • 2021-01-25
    • 2021-04-21
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多