当前位置: 首页 > 面试题库 >

在Swift中检查Firebase快照是否等于nil

杜骏祥
2023-03-14
问题内容

我正在尝试查询Firebase,以检查是否有任何用户,waiting: "1"然后在返回快照时,我想查看它是否等于nil。我尝试执行此操作,但是我使用的方法不起作用,并且如果快照不等于nil,则只有某种输出。我添加了当前拥有的代码和Firebase中的JSON文本。

import UIKit
import Firebase
import Spring

class GamesViewController: UIViewController {

let ref = Firebase(url: "https://123test123.firebaseio.com")
var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

@IBAction func StartGamePressed(sender: AnyObject) {
    print("test1")
    var peopleWaiting: [String] = []

    let userRef = Firebase(url:"https://123test123.firebaseio.com/users")
    userRef.queryOrderedByChild("waiting").queryEqualToValue("1")
        .observeEventType(.ChildAdded, withBlock: { snapshot in
            print(snapshot.key)
            if snapshot.key == nil {
                print("test2")
                let userData = ["waiting": "1"]
                let usersRef = self.ref.childByAppendingPath("users")
                let hopperRef = usersRef.childByAppendingPath("\(self.ref.authData.uid)")

                hopperRef.updateChildValues(userData, withCompletionBlock: {
                    (error:NSError?, ref:Firebase!) in
                    if (error != nil) {
                        print("Data could not be saved.")
                        self.displayAlert("Oops!", message: "We have been unable to get you into a game, check you have an internet conection. If this problem carries on contect support")
                    } else {
                        print("Data saved successfully!")
                        let storyboard = UIStoryboard(name: "Main", bundle: nil)
                        let Home : UIViewController = storyboard.instantiateViewControllerWithIdentifier("continueToGame")
                        self.presentViewController(Home, animated: true, completion: nil)

                    }

                })


            } else {
                var randomUID: String
                peopleWaiting.append(snapshot.key)
                let randomIndex = Int(arc4random_uniform(UInt32(peopleWaiting.count)))
                randomUID = peopleWaiting[randomIndex]
                print(randomUID)
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                let Home : UIViewController = storyboard.instantiateViewControllerWithIdentifier("continueToGame")
                self.presentViewController(Home, animated: true, completion: nil)

            }
        })
}

func displayAlert(title: String, message: String){

    let formEmpty = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    formEmpty.addAction((UIAlertAction(title: "Ok", style: .Default, handler: { (action) -> Void in

    })))

    self.presentViewController(formEmpty, animated: true, completion: nil)
}

func activityIndicatorFunction(){

    activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 100, 100))
    activityIndicator.backgroundColor = UIColor(red:0.16, green:0.17, blue:0.21, alpha:1)
    activityIndicator.layer.cornerRadius = 6
    activityIndicator.center = self.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge
    view.addSubview(activityIndicator)
    activityIndicator.startAnimating()
    UIApplication.sharedApplication().beginIgnoringInteractionEvents()

}


}

JSON数据:

{
"68e42b7f-aea5-4c3f-b655-51a99cb05bb0" : {
  "email" : "test1@test1.com",
  "username" : "test1",
  "waiting" : "0"
},
"8503d5a8-fc4a-492b-9883-ec3664898b4f" : {
  "email" : "test2@test2.com",
  "username" : "test2",
  "waiting" : "0"
}
}

问题答案:

这里发生了几件事,但是最重要的是,您无法测试患儿的存在.ChildAdded。如果您考虑一下,那是有道理的:.ChildAdded当将一个孩子添加到该位置时,将引发该事件。如果未添加任何子代,则不会引发该事件。

因此,如果要测试某个位置是否存在孩子,则需要使用.Value。一旦执行此操作,便可以通过多种方法来检测存在。这是一个:

ref.queryOrderedByChild("waiting").queryEqualToValue("1")
   .observeEventType(.Value, withBlock: { snapshot in
       print(snapshot.value)
       if !snapshot.exists() {
           print("test2")
       }
   });


 类似资料:
  • 问题内容: 在预发布文档中,似乎没有Swift版本的CGPathApply。是否有同等的或替代的?我正在尝试获取CGPath的所有子路径,以便可以从其他起点重绘它。 问题答案: 斯威夫特3.0 在Swift 3.0中,您可以这样使用: 斯威夫特2.2 通过添加,您现在可以直接从Swift进行调用。这是做必要魔术的包装器: (请注意,我的代码中没有提到,但是在Core Graphics模块的声明中使

  • 我需要在。我发现了这里提到的一种方法。它表明: 快照完成后,使用更新的白名单启动原始连接器 但是如何才能发现快照是否完整呢?

  • 问题内容: 我正在尝试检查用户名是否存在。当我打电话时,快照值始终可用,但是它将打印我的整个数据库,而不仅仅是我请求的数据。当我打电话时,它总是返回null。我尝试了很多方法来解决。 这是我的代码: 这是我的json树: 这是安全规则: 问题答案: 修改 JSON 树以包含一个单独的节点,即在您创建新用户时添加每个用户的用户名,在用户修改其用户名时进行修改… 要检查您的用户名是否已经存在: 通过操

  • 问题内容: 我正在尝试检查是否存在用户默认值,如下所示: 但是,无论对象还不存在,它将始终返回true是什么?这是检查存在的正确方法吗? 问题答案: 阿斯通有一个很好的答案。请参阅下面的Swift 3版本。

  • firebase中是否有方法可以检查DB中是否存在值?Firebase有方法。exists(),但根据文档,它只检查键。 我有以下结构: 我想检查是否存在值为U1EL5623的ID。

  • 问题内容: 我正在尝试允许用户通过搜索用户名来开始游戏并关注其他用户。我需要确保具有该用户名的用户存在。我正在使用以下代码,但是尽管调用了,但在应调用时却没有被调用。 JSON数据树 问题答案: 轻松解决: 不要使用.childAdded,因为当查询找不到任何内容时,该块将不会执行。 而是使用.Value并检查NSNull