我有一个Firebase数据库,该数据库存储用于在地图上放置图钉的纬度和经度坐标,唯一的问题是,当我查看地图时,它只会向我显示最后记录的条目。当我检查数据库时,我目前有226个条目,但没有显示。这是我创建的在ViewDidLoad中调用的函数:
import msvcrt
while True:
key = msvcrt.getch().lower()
if key == b'a':
print("You've pressed A. I'll now do the thing I'm supposed to do when you press A.")
elif key == b'q':
print("Quitting...")
break
else:
print("You've pressed a key I don't know how to handle! PANIC!")
答案 0 :(得分:1)
代码使用的是.childAdded,它对每个子节点进行一次迭代,然后在此之后的任何时候添加一个子节点-因此它已经“遍历”了所有子节点。
我看到的第一个问题是,每次加载孩子时,您都会覆盖self.annotation,这似乎是不需要的var类。这导致self.annotation仅包含从Firbase读取的最后一个节点。
您确实应该为每个孩子创建一个新的注释对象,并将其添加到您的dataSource数组中。
第二,似乎没有任何刷新,因此一旦将所有节点加载到您的dataSource中,就不会更新mapView或您正在使用的任何内容。
这是一种可能的解决方案(很多)
//define a class to hold the firebase data
class AnnotationClass {
var key = ""
var lat = ""
var lon = ""
var collTimeMF = ""
var collTimeS = ""
convenience init(fromSnapshot snap: DataSnapshot) {
self.init()
self.key = snap.key
if let dict = snap.value as? [String: Any] {
self.lat = dict["latitude"] as? String ?? ""
self.lon = dict["longitude"] as? String ?? ""
self.collTimeMF = dict["MF"] as? String ?? ""
self.collTimeS = dict["Sat"] as? String ? ""
}
}
}
//a class var array to hold all of the annotations
var annotationArray = [AnnotationClass]()
//the function to read in all of the firebase nodes, populate array, update map
func displayAnnotations() {
let postBoxRef = self.ref.child("Postbox") //self.ref points to my Firebase
postBoxRef.observe(.childAdded, with: { snapshot in
let a = AnnotationClass(fromSnapshot: snapshot)
self.annotationArray.append(a)
//update map
})
}
此代码存在一些问题,对于该用例而言,可能/可能不是问题。如您所见,地图正在随每个子节点进行更新。如果只是少数几个,那没什么大不了的。如果是很多,则可能导致闪烁。
在这种情况下,您可能要考虑通过.value的.observeSingleEvent进行加载,这将使dataSource数组可以一次填充所有数据(通过遍历返回的快照子节点),并且一旦完成更新地图。
请注意,此代码中没有真正的错误检查,因此请添加一些。