0

Firebase를 사용하여 CollectionView의 셀 수를 설정하려고합니다. 지역 변수를 만들고 Firebase 변수와 같은 값으로 설정하려고했지만 함수 밖에서 사용하려고하면 작동하지 않습니다. 또한 ViewWillAppear에서 설정을 시도했지만 작동하지 않았습니다.파이어베이스 변수 외부에서 접근 가능

탐색 표시 줄 제목을 설정하여 값을 봅니다. 가 폐쇄로 설정되었을 때 내가합니다 (중포 기지 기능 후) 폐쇄 외부, 그것이 내가 빠른 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) 

    } 
를 사용하고 0

의 값을 준 쓸 때 나는, 정확한 값을 가지고

...

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


     return numCells 

    } 
+0

'numCells'을 업데이트 한 후에'self.collectionView.reloadData()'를하고 있습니까? – Downgoat

+0

클로저 외부에있는 numCells에 레이블을 설정하면 0 값이 주어 지므로 문제가 있다고 가정합니다. 방금 시도했지만 이제는 완벽하게 작동합니다! 고마워, 그 대답으로 게시 할 수 있습니까? @Downgoat –

+0

가끔씩 만 작동합니다! – Jay

답변

0

중포 기지는 asyncronous이며이 폐쇄 내에서 중포 기지에서 반환 할 때 데이터는 유효합니다.

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의 dataSource로 사용할 배열을 채우려한다고 가정합니다. 우리가 폐쇄 내에서, 클래스 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가 채워지기 전에 발생하므로 print 문 뒤에 실제로 닫힘이 발생합니다.

+0

당신이 print 서술문보다 더 가까워지기를 원한다면 어떻게해야할까요? – Mokadillion

+0

@Mokadillion 클로저에서 코드 * 뒤에 print 문을 넣습니다. Firebase 데이터는 클로저 내에서 사용될 준비가되어 있으므로 작업을 시작하기 전에 데이터를 사용할 수 있도록 UI를 계획해야합니다. – Jay