【发布时间】:2019-12-16 15:23:40
【问题描述】:
我是 Google Firestore 的新手,而且一般都很快,我想知道如何正确设置 onSnapshot() 方法,以便我的视图控制器可以自动接收更新并适应所有情况。
我有一个非常简单的结构 (Llama),用于对我的数据进行建模。通过遵循这个优秀的教程,我能够构建一个基本的 Firestore 设置:(https://youtu.be/XwXEsKRYUXU)
但是,我发现在实现我自己的代码版本时,我只知道如何允许在服务器上创建文档。如果它在服务器上发生更改,我希望能够更新我的应用程序中的对象,并且我也希望能够删除一个。我目前不知道如何做到这一点。
此外,在更新我的应用程序中的对象时,有没有办法只更新更改的字段,而不是覆盖整个对象。
我希望能够实现的是一个数据库模型,它可以在后台在托管服务器和用户设备之间无缝同步,如果发生冲突,可以将任何人的更改合并在一起(由最后修改文档的人解决。 )
我已经详细阅读了 Google 关于该主题的文档,尽管我确定答案就在那里,但我个人还没有达到可以完全理解它们的 swift 水平:(https://cloud.google.com/firestore/docs/how-to)
数据模型:
import Foundation
import Firebase
protocol DocumentSerializable {
init?(dictionary:[String:Any])
}
struct Llama {
var name: String
var color: String
var gender: String
init(name: String, color: String, gender: String) {
self.name = name
self.color = color
self.gender = gender
}
var dictionary:[String:Any] {
return [
"name":name,
"color":color,
"gender":gender
]
}
}
extension Llama:DocumentSerializable {
init? (dictionary: [String:Any]) {
guard
let name = dictionary["name"] as? String,
let color = dictionary["color"] as? String,
let gender = dictionary["gender"] as? String
else {return nil}
self.init(name: name, color: color, gender: gender)
}
}
查看控制器代码:
var llamas = [Llama]()
override func viewDidLoad() {
super.viewDidLoad()
checkForUpdates()
}
func checkForUpdates() {
let firestore = Firestore.firestore()
firestore.collection("Llama").addSnapshotListener{
QuerySnapshot, error in
guard let snapshot = QuerySnapshot else {return}
snapshot.documentChanges.forEach {
update in
if update.type == .added {
self.llamas.append(Llama(dictionary: update.document.data())!) // Works great!
}
if update.type == .modified {
// How can I update the correct llama object, hopefully just the field(s) that changed?
}
if update.type == .removed {
// How can I remove the correct llama object?
}
}
}
}
如视图控制器代码所示,我有一个在视图控制器打开时调用的函数,该函数初始化 addSnapShotListener() 方法。按原样运行的代码不会出现任何错误或警告。我该如何前进?
【问题讨论】:
-
听起来您想在添加、修改或删除某些内容时监听数据库的更改。该文档涵盖了View changes between snapshots
-
谢谢!我知道这个页面刚开始,但很高兴知道我正在关注文档的正确部分。
标签: swift firebase google-cloud-firestore