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


我点击预定按钮
我将sendnig检查值和用户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 ID函数,因为skuter.userKey应该为空字符串。

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

我将非常感谢您的帮助。

谢谢

最佳答案

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

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


另外,您还有:

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


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

09-25 15:57