斯威夫特& Firebase - 观察者在更改数据后返回nil

时间:2018-04-02 18:41:19

标签: ios swift firebase firebase-realtime-database observers

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

 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!)

从顶部的下载功能。文字: &#34;线程1:致命错误:在解包可选值时意外发现nil。&#34;。

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

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

但这种情况似乎有所帮助。有什么建议?

1 个答案:

答案 0 :(得分:0)

使用guard语句,您可以轻松处理经度和纬度的零值。即

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数据库引用中取消注册观察者,则删除子添加块的末尾的数据库处理程序。