地图仅显示最后记录的注释

时间:2018-07-06 21:17:11

标签: ios swift firebase firebase-realtime-database

我有一个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!")

Database Structure

1 个答案:

答案 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数组可以一次填充所有数据(通过遍历返回的快照子节点),并且一旦完成更新地图。

请注意,此代码中没有真正的错误检查,因此请添加一些。