【问题标题】:Global variable appears to lose value (swift)全局变量似乎失去了价值(swift)
【发布时间】:2017-07-21 22:11:38
【问题描述】:

这是我从 firebase 中提取数据的代码。
listofnames(双维)和names(单维)是String类型的全局数组。

但是,当我打印 listofnames 时,输出窗口中会显示一个空数组,而如果我注释第一行 (self.listofnames = [[]]),代码将正常运行。

我已将 ref 与 Firebase 数据库链接

请帮忙。

var databasehandle:FIRDatabaseHandle?

let time = ["8AM - 9AM", "9AM - 10AM","10AM - 11AM", "11AM -12PM", "12PM - 1PM","1PM - 1:30PM","2PM - 3PM","3PM - 4PM","4PM - 5PM","5PM - 6PM","6PM - 7PM","7PM - 7:30PM"]

var ref:FIRDatabaseReference!
var day: String = "Monday"
var users :String = "First years"

func loaddata()
{
    self.listofnames = [[]]
    for x in 0...((time.count)-1)
    {
        ref.child(users).child(day).child(time[x]).observeSingleEvent(of: .value, with: {(snapshot) -> Void in
            if let namesfromFirebase = snapshot.value as? [String:Any]
            {
                let y = namesfromFirebase.count
                for i in 1...y
                {
                    self.names.append(namesfromFirebase["s"+"\(i)"] as! String)
                }
            }
            self.listofnames.append(self.names)
            self.names = []
        })
    }
    print(self.listofnames)
    self.tableView.reloadData()
}

【问题讨论】:

    标签: swift


    【解决方案1】:

    observeSingleEvent 异步工作,闭包稍后调用。

    有一个简单的解决方案:将两行移到闭包中:

    func loaddata()
    {
        self.listofnames = [[]]
        for x in 0..<time.count // no parentheses and math needed when using `..<`
        {
            ref.child(users).child(day).child(time[x]).observeSingleEvent(of: .value, with: {(snapshot) -> Void in
                    if let namesfromFirebase = snapshot.value as? [String:Any]
                    {
                        let y = namesfromFirebase.count
                        for i in 1...y
                        {
                            self.names.append(namesfromFirebase["s"+"\(i)"] as! String)
                        }
                    }
                    self.listofnames.append(self.names)
                    self.names = []
                    print(self.listofnames)
                    self.tableView.reloadData()
            })
        }
    }
    

    【讨论】:

    • 我将使用来自不同函数的变量的内容...然后数组保持为空
    • 那么你需要一个完成处理程序或将使用该变量的代码也放入闭包中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多