我正在尝试使用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 }
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。
请注意,打印功能将在填充tableView之前发生,因为该代码正在同步运行,并且代码比Internet快,因此关闭实际上会在print语句之后发生。