Swift 访问Firebase变量外部闭包

Swift 访问Firebase变量外部闭包,swift,firebase,firebase-realtime-database,uicollectionview,uicollectionviewcell,Swift,Firebase,Firebase Realtime Database,Uicollectionview,Uicollectionviewcell,我正在尝试使用Firebase设置CollectionView中的单元格数。我尝试创建一个局部变量,并将其设置为与Firebase变量相同的值,但当我尝试在函数外部使用它时,它不起作用。我还试着在ViewWillExample中设置它,但没有成功 我设置导航栏标题以查看值。当它在闭包中设置时,我得到了正确的值,当我在闭包外部(在firebase函数之后)写入时,它给出了一个0的值 我用的是swift 3 override func viewWillAppear(_ animated: Bool)

我正在尝试使用Firebase设置CollectionView中的单元格数。我尝试创建一个局部变量,并将其设置为与Firebase变量相同的值,但当我尝试在函数外部使用它时,它不起作用。我还试着在ViewWillExample中设置它,但没有成功

我设置导航栏标题以查看值。当它在闭包中设置时,我得到了正确的值,当我在闭包外部(在firebase函数之后)写入时,它给出了一个0的值

我用的是swift 3

override func viewWillAppear(_ animated: Bool) {

        FIRDatabase.database().reference(withPath: "data").child("numCells").observeSingleEvent(of: .value, with: { (snapshot) in

            if let snapInt = snapshot.value as? Int {


               // self.navigationItem.title = String(snapInt)
                self.numCells = snapInt


            }

        }) { (error) in
            print(error.localizedDescription)
        }

        self.navigationItem.title = String(numCells)

    }


Firebase是异步的,只有在闭包内从Firebase返回数据时,数据才有效

 FIRDatabase.database().reference(withPath: "data").child("numCells")
                      .observeSingleEvent(of: .value, with: { snapshot in
      if let snapInt = snapshot.value as? Int {
           self.navigationItem.title = String(snapInt)
      }
 })
由此展开,假设我们要填充一个数组,用作tableView的数据源

class ViewController: UIViewController {
    //defined tableView or collection or some type of list
    var usersArray = [String]()
    var ref: FIRDatabaseReference!

     func loadUsers() {
          let ref = FIRDatabase.database().reference()
          let usersRef = ref.child("users")

          usersRef.observeSingleEvent(of: .value, with: { snapshot in
              for child in snapshot {
                  let userDict = child as! [String: AnyObject]
                  let name = userDict["name"] as! string
                  self.usersArray.append[name]
              }
              self.myTableView.reloadData()
          })
     }
     print("This will print BEFORE the tableView is populated")
}
请注意,我们从闭包中填充数组,它是一个类var,一旦填充了该数组,仍然在闭包中,我们将刷新tableView

class ViewController: UIViewController {
    //defined tableView or collection or some type of list
    var usersArray = [String]()
    var ref: FIRDatabaseReference!

     func loadUsers() {
          let ref = FIRDatabase.database().reference()
          let usersRef = ref.child("users")

          usersRef.observeSingleEvent(of: .value, with: { snapshot in
              for child in snapshot {
                  let userDict = child as! [String: AnyObject]
                  let name = userDict["name"] as! string
                  self.usersArray.append[name]
              }
              self.myTableView.reloadData()
          })
     }
     print("This will print BEFORE the tableView is populated")
}

请注意,打印函数将在填充tableView之前发生,因为该代码是同步运行的,并且代码比internet快,因此关闭实际上将在print语句之后发生。

您是否正在执行
self.collectionView.reloadData()
更新
numCells
后?当我在闭包外部将标签设置为numCells时,它给出了一个0值,因此我假设问题就在那里。我刚试过,现在它工作得很好!谢谢,你能把它作为回答吗@这只会在某些时候起作用!什么是更具体的解决方案@jay如果你想在print语句之前完成closer,你该怎么做?@Mokadillion将print语句放在闭包中的代码后面。Firebase数据已准备好在闭包中使用(有效),因此您需要在开始使用它之前,围绕确保数据可用来规划UI。