Firebase数据返回无 [英] Firebase Data Returning Nil

查看:83
本文介绍了Firebase数据返回无的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试根据动态Firebase数据创建程序化Radio Buttons. Radio Buttons的数量取决于Firebase中存储的名为numberOfChildren的整数值.

I am trying to create programmatic Radio Buttons based on dynamic Firebase data. The number of Radio Buttonsis dependent on an integer value stored in Firebase, named numberOfChildren.

我从Firebase收到的值又回来了nil,我不知道为什么.对于如何解决此问题以便我可以返回整数值的任何帮助,将不胜感激:

The value I am receiving from Firebase is coming back nil and I cannot figure out why. Any help on how to resolve this issue so that I can return an integer value would be appreciated:

import UIKit
import FirebaseDatabase
import DLRadioButton


 class PollController: UIViewController {

@IBOutlet weak var passLabel: UILabel!
@IBOutlet weak var pollImage: UIImageView!

var ref: FIRDatabaseReference!
var pollRef: FIRDatabaseReference!

var pass = ""
var passedImageURL = ""

var posX = 0;
var posY = 0;

var numberOfChildren: Int!

let label2 = UILabel(frame: CGRect(x: 90, y: 160, width: 200, height: 70))

override func viewDidLoad() {
    super.viewDidLoad()
    ref = FIRDatabase.database().reference()
    pollRef = ref.child("Polls").child(pass)
    passLabel.text = pass
    pollImage.sd_setImage(with: URL(string: passedImageURL), placeholderImage: UIImage(named: "test"))

    pollRef.observe(FIRDataEventType.value, with: {(snapshot) in
        self.numberOfChildren = Int(snapshot.childSnapshot(forPath: "answers").childrenCount)
        self.passLabel.text = String(self.numberOfChildren)
        print(self.numberOfChildren)
    })

    var buttons = [DLRadioButton]()

    for x in 0..<self.numberOfChildren {
        let firstRadioButton = self.createRadioButton(frame: CGRect(x: CGFloat(x)*32, y: self.view.center.y, width: 40.0, height: 20.0), title: String(x), color: UIColor.green)
        firstRadioButton.tag = x
        buttons.append(firstRadioButton)
        self.view.addSubview(firstRadioButton);
    }

    let groupButtons = DLRadioButton()
    groupButtons.otherButtons = buttons

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

private func createRadioButton(frame : CGRect, title : String, color : UIColor) -> DLRadioButton {
    let radioButton = DLRadioButton(frame: frame);
    radioButton.titleLabel!.font = UIFont.systemFont(ofSize: 14);
    radioButton.setTitle(title, for: UIControlState.normal);
    radioButton.setTitleColor(color, for: UIControlState.normal);
    radioButton.iconColor = color;
    radioButton.indicatorColor = color;
    radioButton.contentVerticalAlignment = UIControlContentVerticalAlignment.center;
    radioButton.addTarget(self, action: #selector(self.logSelectedButton(_:)), for: UIControlEvents.touchUpInside);
    return radioButton;
}

@objc private func logSelectedButton(_ sender: DLRadioButton){

    print("Selected Button Tag = \(sender.tag) and Title \(sender.titleLabel?.text)")
   }

}

推荐答案

问题出在嵌套代码的方式上. Firebase异步加载数据,这就是您传递回调块的原因:这样,一旦加载数据,它就可以调用您的代码块.到您查看self.numChildren时,该数据尚未加载.

The problem is in the way you nest the code. Firebase loads the data asynchronously, that's why you pass in a callback block: so that it can call your code block once the data has loaded. By the time you look over self.numChildren that data hasn't loaded yet.

解决方案是将需要numChildren 的代码移到回调块中.

The solution is to move the code that requires numChildren into the callback block.

pollRef.observe(FIRDataEventType.value, with: {(snapshot) in
    self.numberOfChildren = Int(snapshot.childSnapshot(forPath: "answers").childrenCount)
    self.passLabel.text = String(self.numberOfChildren)

    var buttons = [DLRadioButton]()

    for x in 0..<self.numberOfChildren {
        let firstRadioButton = self.createRadioButton(frame: CGRect(x: CGFloat(x)*32, y: self.view.center.y, width: 40.0, height: 20.0), title: String(x), color: UIColor.green)
        firstRadioButton.tag = x
        buttons.append(firstRadioButton)
        self.view.addSubview(firstRadioButton);
    }

    let groupButtons = DLRadioButton()
    groupButtons.otherButtons = buttons
})

这样,仅在从数据库初始化numChildren后,才调用循环.

This way the loop is only invoked once numChildren has been initialized from the database.

这篇关于Firebase数据返回无的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆