Firebase正在存储价值,即使用户删除了它

时间:2018-06-20 13:40:52

标签: ios swift firebase firebase-realtime-database

我正在为存储数据而苦苦挣扎。我正在编写使用Firebase进行身份验证和作为数据库的应用程序。该应用程序可作为踏板车共享。当用户点击一个标记并点击保留按钮时,踏板车将通过发送字符串值进行保留。它是这样的:

  • 我正在点击预定按钮
  • 我将sendenig检查值和用户ID作为userKey发送给选定的踏板车记录
  • 我正在等待服务器响应(反馈)
  • 如果有响应开始预订

如果用户改变主意并单击“取消”按钮,我将清除userKey并将状态从“保留”更改为“关闭”。 而且有一个问题。 即使在适当的踏板车上清除了userKey时,仍可以执行负责预订的功能。例如,当我模拟服务器并向先前保留的踏板车发送feedback命令时,即使userKey为空字符串,仍可以执行下面的代码。尚未保留的踏板车并没有发生这种情况。主要代码如下:

    func fetchScooters(){


    ref?.child("service").child("scooters").observe(.value, with: { (snapshot) in

        if snapshot.exists(){
            let array:NSArray = snapshot.children.allObjects as NSArray

            self.skutery = []

            for child in array{

                let snap = child as! DataSnapshot

                if let dictionary = snap.value as? [String: Any] {

                    let skuter = ScooterInformation()

                    skuter.name = dictionary["name"] as? String
                    skuter.state = dictionary["state"] as? String
                    skuter.latitude = dictionary["latitude"] as? String
                    skuter.longitude = dictionary["longitude"] as? String
                    skuter.battery = dictionary["battery"] as? String
                    skuter.engine = dictionary["engine"] as? String
                    skuter.start = dictionary["start"] as? CLong
                    skuter.userKey = dictionary["userKey"] as? String


                    self.skutery.append(skuter)

                    if skuter.userKey == self.userID{


                        self.hideAllScootersIfUserReserved(scooterInfo: self.skutery)

                        // THERE IS SOMETHING WRONG....

                        self.handle = snap.ref.child("feedback").observe(.value, with: { (feedback) in
                            if let feedback = feedback.value as? Bool{
                                    if feedback && skuter.userKey == self.userID{

                                        print("Feedback received")
                                        self.coundDown.invalidate()
                                        self.timeToConnect = 20
                                        snap.ref.child("feedback").removeValue()
                                        snap.ref.child("check").removeValue()


                                        if self.wantToRunScooter {
                                            self.startScooter()

                                        } else if self.userIsReservedScooter{
                                            self.setStatusAsReserved()
                                            self.userIsReservedScooter = false

                                        }


                                }
                            }


                        })

点击取消按钮,将执行以下操作:

 ref?.child("service").child("scooters").child("\(scooterNumber!)").child("state").setValue("*oF&")
 ref?.child("service").child("scooters").child("\(scooterNumber!)").child("userKey").setValue("")

由于handle应该为空字符串,即使skuter.userKey不等于User IDskuter.userKey函数仍然可以执行。

第二天我很挣扎,不知道这是怎么了。

我将非常感谢您的帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

当用户按下“取消”按钮时,您的代码仅更改状态和userKey,但不更改将返回为true的反馈值。您需要添加一些内容来更改反馈:

ref?.child("service").child("scooters").child("\(scooterNumber!)").child("feedback").setValue(false)

加上您有

if feedback && skuter.userKey == self.userID{ .... }

feedback不是布尔型,skuter.userKey是字符串吗?布尔&&字符串==字符串如何?