离线时的 Firebase 发布商

Firebase publishers while offline

提问人:fingia 提问时间:7/4/2023 最后编辑:jnpdxfingia 更新时间:7/4/2023 访问量:62

问:

我正在尝试理解依赖 Firebase 实时数据库作为其事实来源的应用程序的后果,例如,名为卡片的项目列表。

假设一个人有这样的设计

enter image description here

假设应用订阅了卡片,当卡片列表发生更改时,应用会在内部发布它。用 Swift 的术语来说,它可能看起来像这样:

class ViewModel: ObservableObject {
  @Published var cards: [Card] = []

  init() {
    dataManager.cardPublisher
      .sink(receiveValue: { [weak self] (cards) in
         self?.cards = cards
      })
      .store(in: &cancellables)
    }
}

我们知道,如果我通过控制台更新数据库,应用程序将接收发出的值,并通过视图模型在内部“发布”更改。

订阅者接收值的另一种方式是应用本身更新 db。

这就是我感兴趣的情况:如果应用程序处于“离线”状态并且更新数据库的请求成功,会发生什么情况?订阅者会收到一个值并发出一个值吗?请注意,Firebase 声明它保留数据库的本地状态,以便精确地离线功能,并且操作将排队,以便当应用程序上线时,本地和云状态会同步。

假设 cardPublisher 是 Firebase 数据库引用的 'observe(.value) ' 中使用的发布者,这样在更改值时,此发布者会发出一个值。

'''

    // receive event any time the path and anything under it changes. 
    cardsDbReference.observe(.value, with: { [weak self] snapshot in
        var carda: [Card] = []
        for case let childSnapshot as DataSnapshot in snapshot.children {
            guard let value = childSnapshot.value as? [String: Any] else {
                print("Error: Could not retrieve cards.")
                continue
            }

            do {
                let cardData = try JSONSerialization.data(withJSONObject: value, options: [])
                let decoder = JSONDecoder()
                let card = try decoder.decode(Card.self, from: cardData)
                cards.append(card)
            } catch {
                print("Decoding error: \(error.localizedDescription)")
            }
        }

        self?.cardPublisher.send(cards)
    })

'''

swift firebase-实时数据库

评论

0赞 jnpdx 7/4/2023
您尚未显示 或 的任何代码,因此无法知道它在脱机时是否会发出值。dataManagercardPublisher
0赞 fingia 7/4/2023
真。解决。

答:

0赞 Frank van Puffelen 7/4/2023 #1

我不确定我是否理解您问题中的所有内容,因此我将重点介绍数据库和 SDK 的工作原理。

  • 调用 API 写入时立即进行本地写入操作文件的事件。这意味着,即使客户端未连接到数据库,也会调用您的闭包进行本地写入。cardsDbReference.observe(.valuecardsDbReference
  • 完成侦听器仅在服务器提交/拒绝数据时触发。因此,在客户端再次连接到数据库之前,您可能拥有的任何完成侦听器都不会触发。

我建议对此进行测试,因为看到两者的实际效果比通常的解释更清晰。

评论

0赞 fingia 7/4/2023
弗兰克,为不太理想的描述道歉。这个解释的第一个要点就是答案。泰。