【发布时间】:2017-12-12 01:22:27
【问题描述】:
我正在使用谷歌地图,我的用户可以在地图上添加地图标记。 地图标记存储在 Firestore 中。 我有一个监听数据库的监听器。 每个用户只能提交一个地图标记 - 因此数据库中每个用户只有一个文档。但他们可以修改标记的 lat 和 lng。
我的 Firestore 设置为:
root
- submittedMarkers (collection)
- fireauthID_1 (document)
- field 1 (lat):
- field 2 (lng):
- fireauthID_2 (document)
- field 1 (lat):
- field 2 (lng):
// MapController.swift
override func viewWillAppear(_ animated: Bool){
listener = db.collection("submittedMarkers").addSnapshotListener { querySnapshot, error in
guard let snapshot = querySnapshot else {
print("Error fetching snapshots: \(error!)")
return
}
snapshot.documentChanges.forEach { diff in
if (diff.type == .added){
print("added")
}
if(diff.type == .modified) {
print("modified the document in firestore")
}
}
}
}
目前为了调试,我在 firestore 中只有一个用户,submittedMarkers 下只有一个文档 -> {fireauthId}。
当我的应用加载当前存在的单个标记时,将与单个打印语句“添加”一起添加到地图中。这样就行了。
这是我遇到的问题。
当一个新用户注册并获得一个 fireauth id 时,他们可以从AddMarkerController 添加一个标记。当他们提交标记时,我使用 unwind segue 让他们回到MapController。 (我不会在任何阶段将监听器与MapController 分离)。
// 添加标记控制器
docref = db.collection("submittedMarkers").document(currentUserId)
docref?.setData([
"latitude": latitude,
"longitude": longitude,
"date_time": date!,
"distance": dist,
"speed": speed
], options: SetOptions.merge()) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
}
}
但我发现,当他们回到MapController 时,if (diff.type == .added) 会执行两次,并且 print(" added") 会发生两次,即使 currentuser fireauth id 只是在集合下添加了一次submittedMarkers。
当我打印出 diff.document.ID 时,我得到了已经在 firestore 中的用户和刚刚添加新文档的当前用户的 fireauth id。
我怀疑我不太明白监听器是如何工作的。我以为if(diff = .added) 会监听submittedMarkers 集合,并且只会在添加新文档时触发一次。
我不确定问题是否是:
- 我离开
MapController时没有分离监听器 ->AddMarkerController? - 听众在
viewWillAppear而不是viewDidLoad,但从阅读firebase博客来看,它应该在viewWillAppear - 无论是
snapshot.documentChanges.forEach在每次发生变化时循环整个快照
【问题讨论】:
标签: swift google-cloud-firestore