gpt4 book ai didi

ios - Swift 和 Firebase - 更改数据后观察者返回 nil

转载 作者:行者123 更新时间:2023-11-30 11:37:15 25 4
gpt4 key购买 nike

我的应用程序出现问题。当我在第一个 ViewController 上初始化应用程序时,我使用此代码和一个名为“By”的对象以及一个名为“byer”的对象数组从我的 Firebase 服务器获取一些数据:

 func download() {
byer.removeAll()
self.Handle = self.ref?.child("Byer").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let by = By()
by.Latitude = dictionary["Latitude"]?.doubleValue
by.Longitude = dictionary["Longitude"]?.doubleValue
by.Name = snapshot.key
let coordinate = CLLocation(latitude: by.Latitude!, longitude: by.Longitude!)
let distanceInMeter = coordinate.distance(from: self.locationManager.location!)
by.Distance = Int(distanceInMeter)
byer.append(by)
byer = byer.sorted(by: {$0.Distance! < $1.Distance! })
DispatchQueue.main.async {
selectedCity = byer[0].Name!
self.performSegue(withIdentifier: "GoToMain", sender: nil)
}
}
})
}

这一切都运行良好。但当我稍后在应用程序中偶然发现数据库中的值时,问题就出现了。我使用带有以下代码的按钮:

 if byTextfield.text != "" && latitude != nil && longitude != nil {
ref?.child("Byer").child(byTextfield.text!).child("Latitude").setValue(latitude)
ref?.child("Byer").child(byTextfield.text!).child("Longitude").setValue(longitude)
}

但由于某种原因,应用程序崩溃了,并且线上出现了一条红线:

 let coordinate = CLLocation(latitude: by.Latitude!, longitude: by.Longitude!)

来自顶部的下载功能。以及文字:“线程 1: fatal error :解包可选值时意外发现 nil。”。

我尝试使用以下方法删除观察者:

 override func viewDidDisappear(_ animated: Bool) {
self.ref?.removeObserver(withHandle: self.Handle)
}

但这似乎没有帮助。有什么建议么?

最佳答案

使用guard语句你可以轻松处理经度和纬度的nil值。即

func download() {
byer.removeAll()
self.Handle = self.ref?.child("Byer").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let by = By()
guard let latitude = dictionary["Latitude"]?.doubleValue,let longitude =
dictionary["Longitude"]?.doubleValue else
{
return
}

by.Latitude = latitude
by.Longitude = longitude
by.Name = snapshot.key
let coordinate = CLLocation(latitude: by.Latitude!, longitude: by.Longitude!)
let distanceInMeter = coordinate.distance(from: self.locationManager.location!)
by.Distance = Int(distanceInMeter)
byer.append(by)
byer = byer.sorted(by: {$0.Distance! < $1.Distance! })
DispatchQueue.main.async {
selectedCity = byer[0].Name!
self.performSegue(withIdentifier: "GoToMain", sender: nil)
}
}
})
}

如果您想从 Firebase 数据库引用中取消注册观察者,请删除 childadded block 末尾的数据库处理程序。

关于ios - Swift 和 Firebase - 更改数据后观察者返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49616862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com