在Closure外部访问Firebase变量

时间:2017-05-06 18:08:59

标签: swift firebase firebase-realtime-database uicollectionview uicollectionviewcell

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

我设置导航栏标题以查看值。当它在闭包中设置时,我得到了正确的值,当我在闭包之外写入(在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)

    }

...

 override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of items


       return numCells

    }

1 个答案:

答案 0 :(得分:0)

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。

请注意,printView函数将在填充tableView之前发生,因为该代码同步运行且代码比Internet快,因此闭包实际上会在print语句之后发生。