function returns after changing Firebase observer SWIFT 4
function returns after changing Firebase observer SWIFT 4
我正在重写我的 firebase 函数以将它自己的函数放入从数据库获取数据的实时部分,所以我在引用数据库时从 .observe(.childAdded, with: {(snapshot) in
更改为 .observeSingleEvent(of: .value, with: { (snapshot) in
。该功能现在在 guard let data = snapshot.value as? [String :String] else { return }
返回,而以前没有..
快照相同时发生了什么变化?对它的任何解释都会很棒,因为我自己看不到它。
非常感谢一如既往。
以下是函数的两个版本:
老观察员:
func displayAlerts(setCompletion: @escaping (Bool) -> ()) {
self.mapView.removeAnnotations(mapView.annotations)
MapArray.alertNotificationCoordinatesArray.removeAll()
self.userAlertNotificationArray.removeAll()
print(" MapArray.alertNotificationCoordinatesArray before snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray before snapshot is: \(self.userAlertNotificationArray)")
ref = Database.database().reference()
databaseHandle = ref?.child("Continent").child("Europe").child("Country").child("Italy").child("Region").child("Emilia-Romagna").child("City").child("Bologna").child("Community").child("Alert Notifications").observe(.childAdded, with: { (snapshot) in
// self.mapView.removeAnnotations(self.mapView.annotations) //
print(" snapshot is: \(snapshot)")
guard let data = snapshot.value as? [String:String] else { return }
guard let firebaseKey = snapshot.key as? String else { return }
// let date = data!["Date"]
// let time = data!["Time"]
let dataLatitude = data["Latitude"]!
let dataLongitude = data["Longitude"]!
let type = data["Description"]!
let id = Int(data["Id"]!)
let doubledLatitude = Double(dataLatitude)
let doubledLongitude = Double(dataLongitude)
let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude!, longitude: doubledLongitude!)
print("Firebase alerts posts retrieved")
let userAlertAnnotation = UserAlert(type: type, coordinate: recombinedCoordinate, firebaseKey: firebaseKey, title: type,id: id!)
self.userAlertNotificationArray.append(userAlertAnnotation) // array of notifications coming from Firebase
// print("userAlertNotificationArray after retrieving from Firebase is : \(self.userAlertNotificationArray)")
MapArray.alertNotificationCoordinatesArray.append(recombinedCoordinate) // array for checkig alerts on route
print(" MapArray.alertNotificationCoordinatesArray after snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray after snapshot is: \(self.userAlertNotificationArray)")
setCompletion(true)
self.mapView.addAnnotations(self.userAlertNotificationArray)
})
}
新观察者:
func displayAlerts(setCompletion: @escaping (Bool) -> ()) {
print(" MapArray.alertNotificationCoordinatesArray before newer displayAlert snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray before displayAlert snapshot is: \(self.userAlertNotificationArray)")
if self.userAlertNotificationArray.count == 0 {
ref = Database.database().reference()
ref?.child("Continent").child("Europe").child("Country").child("Italy").child("Region").child("Emilia-Romagna").child("City").child("Bologna").child("Community").child("Alert Notifications").observeSingleEvent(of: .value, with: { (snapshot) in
// self.mapView.removeAnnotations(self.mapView.annotations) //
print(" snapshot is: \(snapshot)")
guard let data = snapshot.value as? [String :Any] else { return }
guard let firebaseKey = snapshot.key as? String else { return }
// let date = data!["Date"]
// let time = data!["Time"]
let dataLatitude = data["Latitude"] as! Double
let dataLongitude = data["Longitude"] as! Double
let type = data["Description"] as! String
let id = Int(data["Id"] as! String)
let doubledLatitude = Double(dataLatitude)
let doubledLongitude = Double(dataLongitude)
let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude, longitude: doubledLongitude)
print("Firebase alerts posts retrieved")
let userAlertAnnotation = UserAlert(type: type, coordinate: recombinedCoordinate, firebaseKey: firebaseKey, title: type,id: id!)
self.userAlertNotificationArray.append(userAlertAnnotation) // array of notifications coming from Firebase
MapArray.alertNotificationCoordinatesArray.append(recombinedCoordinate) // array for checkig alerts on route
print(" MapArray.alertNotificationCoordinatesArray after newer displayAlert snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray after newer displayAlert snapshot is: \(self.userAlertNotificationArray)")
self.mapView.addAnnotations(self.userAlertNotificationArray)
setCompletion(true)
})
}
}
编辑:
这里是快照的打印件,以便查看两个版本的结果:
observeSingleEvent 快照:
snapshot is: Snap (Alert Notifications) {
"-LZtTuFSKMhhXFwyT-7K" = {
Description = "Ciclabile chiusa";
Id = 0;
Latitude = "44.50139187990401";
Longitude = "11.33592981426992";
};
"-LZtUV8MOxVrvPnEfi4g" = {
Description = "Lavori in corso";
Id = 1;
Latitude = "44.5013918797401";
Longitude = "11.335929814371545";
};
"-LZtV7sJJrOQjAimszTm" = {
Description = "Pericoli sulla ciclabile";
Id = 2;
Latitude = "44.50139187974223";
Longitude = "11.335929814367324";
};
}
和孩子添加的快照:
snapshot is: Snap (-LZtTuFSKMhhXFwyT-7K) {
Description = "Ciclabile chiusa";
Id = 0;
Latitude = "44.50139187990401";
Longitude = "11.33592981426992";
}
snapshot is: Snap (-LZtUV8MOxVrvPnEfi4g) {
Description = "Lavori in corso";
Id = 1;
Latitude = "44.5013918797401";
Longitude = "11.335929814371545";
}
snapshot is: Snap (-LZtV7sJJrOQjAimszTm) {
Description = "Pericoli sulla ciclabile";
Id = 2;
Latitude = "44.50139187974223";
Longitude = "11.335929814367324";
}
改变
guard let data = snapshot.value as? [String :String] else { return }
至
guard let data = snapshot.value as? [String :[String:String]] else { return }
data.values.forEach {
print([=11=]["Latitude"])
print([=11=]["Longitude"])
}
你能举例说明 json 是如何存储在数据库中的吗?与
.observe(.childAdded, with: {(snapshot) in
您只收到已添加的 child,以及
.observeSingleEvent(of: .value, with: { (snapshot) in
你收到了整个节点,所以也许节点不是 [String:String] 它可能不止一个项目所以它应该是 [String:Any] 然后你可以从里面得到每个 child它。
这只是部分答案,但经过多次不同的尝试并在 Sh_Khan 的帮助下,我们必须让它发挥作用。问题出在需要 guard let data = snapshot.value as? [String : [String : String] else { return }
的行 guard let data = snapshot.value as? [String :Any] else { return }
中。
所以函数必须写成:
func displayAlerts(setCompletion: @escaping (Bool) -> ()) {
print(" MapArray.alertNotificationCoordinatesArray before displayAlert snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray before displayAlert snapshot is: \(self.userAlertNotificationArray)")
if self.userAlertNotificationArray.count == 0 {
ref = Database.database().reference()
ref?.child("Continent").child("Europe").child("Country").child("Italy").child("Region").child("Emilia-Romagna").child("City").child("Bologna").child("Community").child("Alert Notifications").observeSingleEvent(of: .value, with: { (snapshot) -> Void in
print(" snapshot is: \(snapshot)")
guard let data = snapshot.value as? [String :[String:String]] else { return }
guard let firebaseKey = snapshot.key as? String else { return }
data.values.forEach {
// let firebaseKey = data.keys[]
let dataLatitude = [=10=]["Latitude"]!
let dataLongitude = [=10=]["Longitude"]!
let type = [=10=]["Description"]!
let id = Int([=10=]["Id"]!)
print("firebaseKey is:\(firebaseKey)")
print("dataLatitude is: \(dataLatitude)")
print("dataLongitude is: \(dataLongitude)")
print("type is: \(type)")
print("id is: \(id)")
print("Key is: \(firebaseKey)")
print("data is: \(data)")
let doubledLatitude = Double(dataLatitude)
let doubledLongitude = Double(dataLongitude)
let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude!, longitude: doubledLongitude!)
let userAlertAnnotation = UserAlert(type: type, coordinate: recombinedCoordinate, firebaseKey: firebaseKey, title: type,id: id!)
self.userAlertNotificationArray.append(userAlertAnnotation) // array of notifications coming from Firebase
MapArray.alertNotificationCoordinatesArray.append(recombinedCoordinate)
}
print("Firebase alerts posts retrieved")
print(" MapArray.alertNotificationCoordinatesArray after displayAlert snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray after displayAlert snapshot is: \(self.userAlertNotificationArray)")
self.mapView.addAnnotations(self.userAlertNotificationArray)
setCompletion(true)
})
}
}
现在我有两件事要解决。第一:如何获取 child 键,因为行 guard let firebaseKey = snapshot.key as? String else { return }
给了我节点的名称?
第二:当将新的 child 添加到节点时,我创建的新函数只是为了使用 .observe(.childAdded, with: { (snapshot) in
获取 newerAlerts 而不会被调用。
我应该提出新问题还是继续此处?
谢谢
我正在重写我的 firebase 函数以将它自己的函数放入从数据库获取数据的实时部分,所以我在引用数据库时从 .observe(.childAdded, with: {(snapshot) in
更改为 .observeSingleEvent(of: .value, with: { (snapshot) in
。该功能现在在 guard let data = snapshot.value as? [String :String] else { return }
返回,而以前没有..
快照相同时发生了什么变化?对它的任何解释都会很棒,因为我自己看不到它。
非常感谢一如既往。
以下是函数的两个版本:
老观察员:
func displayAlerts(setCompletion: @escaping (Bool) -> ()) {
self.mapView.removeAnnotations(mapView.annotations)
MapArray.alertNotificationCoordinatesArray.removeAll()
self.userAlertNotificationArray.removeAll()
print(" MapArray.alertNotificationCoordinatesArray before snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray before snapshot is: \(self.userAlertNotificationArray)")
ref = Database.database().reference()
databaseHandle = ref?.child("Continent").child("Europe").child("Country").child("Italy").child("Region").child("Emilia-Romagna").child("City").child("Bologna").child("Community").child("Alert Notifications").observe(.childAdded, with: { (snapshot) in
// self.mapView.removeAnnotations(self.mapView.annotations) //
print(" snapshot is: \(snapshot)")
guard let data = snapshot.value as? [String:String] else { return }
guard let firebaseKey = snapshot.key as? String else { return }
// let date = data!["Date"]
// let time = data!["Time"]
let dataLatitude = data["Latitude"]!
let dataLongitude = data["Longitude"]!
let type = data["Description"]!
let id = Int(data["Id"]!)
let doubledLatitude = Double(dataLatitude)
let doubledLongitude = Double(dataLongitude)
let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude!, longitude: doubledLongitude!)
print("Firebase alerts posts retrieved")
let userAlertAnnotation = UserAlert(type: type, coordinate: recombinedCoordinate, firebaseKey: firebaseKey, title: type,id: id!)
self.userAlertNotificationArray.append(userAlertAnnotation) // array of notifications coming from Firebase
// print("userAlertNotificationArray after retrieving from Firebase is : \(self.userAlertNotificationArray)")
MapArray.alertNotificationCoordinatesArray.append(recombinedCoordinate) // array for checkig alerts on route
print(" MapArray.alertNotificationCoordinatesArray after snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray after snapshot is: \(self.userAlertNotificationArray)")
setCompletion(true)
self.mapView.addAnnotations(self.userAlertNotificationArray)
})
}
新观察者:
func displayAlerts(setCompletion: @escaping (Bool) -> ()) {
print(" MapArray.alertNotificationCoordinatesArray before newer displayAlert snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray before displayAlert snapshot is: \(self.userAlertNotificationArray)")
if self.userAlertNotificationArray.count == 0 {
ref = Database.database().reference()
ref?.child("Continent").child("Europe").child("Country").child("Italy").child("Region").child("Emilia-Romagna").child("City").child("Bologna").child("Community").child("Alert Notifications").observeSingleEvent(of: .value, with: { (snapshot) in
// self.mapView.removeAnnotations(self.mapView.annotations) //
print(" snapshot is: \(snapshot)")
guard let data = snapshot.value as? [String :Any] else { return }
guard let firebaseKey = snapshot.key as? String else { return }
// let date = data!["Date"]
// let time = data!["Time"]
let dataLatitude = data["Latitude"] as! Double
let dataLongitude = data["Longitude"] as! Double
let type = data["Description"] as! String
let id = Int(data["Id"] as! String)
let doubledLatitude = Double(dataLatitude)
let doubledLongitude = Double(dataLongitude)
let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude, longitude: doubledLongitude)
print("Firebase alerts posts retrieved")
let userAlertAnnotation = UserAlert(type: type, coordinate: recombinedCoordinate, firebaseKey: firebaseKey, title: type,id: id!)
self.userAlertNotificationArray.append(userAlertAnnotation) // array of notifications coming from Firebase
MapArray.alertNotificationCoordinatesArray.append(recombinedCoordinate) // array for checkig alerts on route
print(" MapArray.alertNotificationCoordinatesArray after newer displayAlert snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray after newer displayAlert snapshot is: \(self.userAlertNotificationArray)")
self.mapView.addAnnotations(self.userAlertNotificationArray)
setCompletion(true)
})
}
}
编辑:
这里是快照的打印件,以便查看两个版本的结果:
observeSingleEvent 快照:
snapshot is: Snap (Alert Notifications) {
"-LZtTuFSKMhhXFwyT-7K" = {
Description = "Ciclabile chiusa";
Id = 0;
Latitude = "44.50139187990401";
Longitude = "11.33592981426992";
};
"-LZtUV8MOxVrvPnEfi4g" = {
Description = "Lavori in corso";
Id = 1;
Latitude = "44.5013918797401";
Longitude = "11.335929814371545";
};
"-LZtV7sJJrOQjAimszTm" = {
Description = "Pericoli sulla ciclabile";
Id = 2;
Latitude = "44.50139187974223";
Longitude = "11.335929814367324";
};
}
和孩子添加的快照:
snapshot is: Snap (-LZtTuFSKMhhXFwyT-7K) {
Description = "Ciclabile chiusa";
Id = 0;
Latitude = "44.50139187990401";
Longitude = "11.33592981426992";
}
snapshot is: Snap (-LZtUV8MOxVrvPnEfi4g) {
Description = "Lavori in corso";
Id = 1;
Latitude = "44.5013918797401";
Longitude = "11.335929814371545";
}
snapshot is: Snap (-LZtV7sJJrOQjAimszTm) {
Description = "Pericoli sulla ciclabile";
Id = 2;
Latitude = "44.50139187974223";
Longitude = "11.335929814367324";
}
改变
guard let data = snapshot.value as? [String :String] else { return }
至
guard let data = snapshot.value as? [String :[String:String]] else { return }
data.values.forEach {
print([=11=]["Latitude"])
print([=11=]["Longitude"])
}
你能举例说明 json 是如何存储在数据库中的吗?与
.observe(.childAdded, with: {(snapshot) in
您只收到已添加的 child,以及
.observeSingleEvent(of: .value, with: { (snapshot) in
你收到了整个节点,所以也许节点不是 [String:String] 它可能不止一个项目所以它应该是 [String:Any] 然后你可以从里面得到每个 child它。
这只是部分答案,但经过多次不同的尝试并在 Sh_Khan 的帮助下,我们必须让它发挥作用。问题出在需要 guard let data = snapshot.value as? [String : [String : String] else { return }
的行 guard let data = snapshot.value as? [String :Any] else { return }
中。
所以函数必须写成:
func displayAlerts(setCompletion: @escaping (Bool) -> ()) {
print(" MapArray.alertNotificationCoordinatesArray before displayAlert snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray before displayAlert snapshot is: \(self.userAlertNotificationArray)")
if self.userAlertNotificationArray.count == 0 {
ref = Database.database().reference()
ref?.child("Continent").child("Europe").child("Country").child("Italy").child("Region").child("Emilia-Romagna").child("City").child("Bologna").child("Community").child("Alert Notifications").observeSingleEvent(of: .value, with: { (snapshot) -> Void in
print(" snapshot is: \(snapshot)")
guard let data = snapshot.value as? [String :[String:String]] else { return }
guard let firebaseKey = snapshot.key as? String else { return }
data.values.forEach {
// let firebaseKey = data.keys[]
let dataLatitude = [=10=]["Latitude"]!
let dataLongitude = [=10=]["Longitude"]!
let type = [=10=]["Description"]!
let id = Int([=10=]["Id"]!)
print("firebaseKey is:\(firebaseKey)")
print("dataLatitude is: \(dataLatitude)")
print("dataLongitude is: \(dataLongitude)")
print("type is: \(type)")
print("id is: \(id)")
print("Key is: \(firebaseKey)")
print("data is: \(data)")
let doubledLatitude = Double(dataLatitude)
let doubledLongitude = Double(dataLongitude)
let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude!, longitude: doubledLongitude!)
let userAlertAnnotation = UserAlert(type: type, coordinate: recombinedCoordinate, firebaseKey: firebaseKey, title: type,id: id!)
self.userAlertNotificationArray.append(userAlertAnnotation) // array of notifications coming from Firebase
MapArray.alertNotificationCoordinatesArray.append(recombinedCoordinate)
}
print("Firebase alerts posts retrieved")
print(" MapArray.alertNotificationCoordinatesArray after displayAlert snapshot is: \(MapArray.alertNotificationCoordinatesArray)")
print(" self.userAlertNotificationArray after displayAlert snapshot is: \(self.userAlertNotificationArray)")
self.mapView.addAnnotations(self.userAlertNotificationArray)
setCompletion(true)
})
}
}
现在我有两件事要解决。第一:如何获取 child 键,因为行 guard let firebaseKey = snapshot.key as? String else { return }
给了我节点的名称?
第二:当将新的 child 添加到节点时,我创建的新函数只是为了使用 .observe(.childAdded, with: { (snapshot) in
获取 newerAlerts 而不会被调用。
我应该提出新问题还是继续此处?
谢谢