提问人:fingia 提问时间:7/4/2023 最后编辑:jnpdxfingia 更新时间:7/4/2023 访问量:62
离线时的 Firebase 发布商
Firebase publishers while offline
问:
我正在尝试理解依赖 Firebase 实时数据库作为其事实来源的应用程序的后果,例如,名为卡片的项目列表。
假设一个人有这样的设计
假设应用订阅了卡片,当卡片列表发生更改时,应用会在内部发布它。用 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)
})
'''
答:
0赞
Frank van Puffelen
7/4/2023
#1
我不确定我是否理解您问题中的所有内容,因此我将重点介绍数据库和 SDK 的工作原理。
- 调用 API 写入时立即进行本地写入操作文件的事件。这意味着,即使客户端未连接到数据库,也会调用您的闭包进行本地写入。
cardsDbReference.observe(.value
cardsDbReference
- 完成侦听器仅在服务器提交/拒绝数据时触发。因此,在客户端再次连接到数据库之前,您可能拥有的任何完成侦听器都不会触发。
我建议对此进行测试,因为看到两者的实际效果比通常的解释更清晰。
评论
0赞
fingia
7/4/2023
弗兰克,为不太理想的描述道歉。这个解释的第一个要点就是答案。泰。
评论
dataManager
cardPublisher