2017-03-27 9 views
0

firebaseでネストされたデータを取得しようとしています。しかし、私は自分のコードにいくつかの問題があります。ファイアベースネストしたクエリ(完了時)

-contentlikes 
    -userID: true, 
    -userID: true, 
    -userID: true 
-users 
    -userID 
     -name: "John" 

そして、私のコードは次のとおりです:

私firebaseデータがある私は、ユーザーを取得したいが、私は行うことができます方法を見つけ出すことはできません

override func viewWillAppear(_ animated: Bool) { 
    self.displayUserKeys(completionHandler: { (userKeysInside, errorInside) in 
     if userKeysInside != nil { 
      self.userKeys = userKeysInside! 
      print(self.userKeys) 
     } 
     self.detailUserTableView.rowHeight = UITableViewAutomaticDimension 
     self.detailUserTableView.estimatedRowHeight = 64 
     self.detailUserTableView.dataSource = self 
     self.detailUserTableView.delegate = self 
     self.detailUserTableView.reloadData() 
    }) 
} 

func displayUserKeys(completionHandler: @escaping ([String]?, Error?) ->()) { 
    self.detailUserHandler = DataService.dataService.CONTENTLIKE_REF.observe(.value, with: { (snapshot) in 
     self.userKeys.removeAll() 
     var userKeyInside = [String]() 
     for child in snapshot.children.allObjects as! [FIRDataSnapshot] { 
      let key = child.key 
      userKeyInside.append(key) 
     } 
     completionHandler(userKeyInside, nil) 
    }) { (errorInside) in 
     completionHandler(nil, errorInside) 
    } 
} 

+0

DataServiceクラスから関連コードを投稿できますか? – faircloud

+0

CONTENTLIKE_REF = FIRDatabase.database()。参照(withPath: "contentlikes") – Brkr

+0

あなたのアプリケーションデリゲートにfirebaseを設定していますか? – faircloud

答えて

1

最初のクエリから取得したキーに基づいて、別のユーザーノードからユーザーの詳細を取得する必要があります。 Firebaseは結合クエリを提供しないので、ObserveSingleEvent型のユーザの詳細について再度問い合わせる必要があります。

これはサンプルコードです。私はxcodeエディタなしでそれを書いているので、愚かな間違いを許してください。

 func displayUserKeys(completionHandler: @escaping ([String]?, Error?) ->()) { 
      self.detailUserHandler = DataService.dataService.CONTENTLIKE_REF.observe(.value, with: { (snapshot) in 
       self.userKeys.removeAll() 
       var userKeyInside = [String]() 
       var userFetched = 0 

       for child in snapshot.children.allObjects as! [FIRDataSnapshot] { 
        let key = child.key 

        //Query again to fetch user details. 
        DataService.dataService.USER_REF.path(key).observeSingleEvent(.value, with: { (snapshot) in 
           userFetched = userFetched + 1 
           let user = snapshot.value 
           //Append user to the array 
           userInside.append(user) 
         //Return back the array when all the user details as fetched. 
         if(userFetched == snapshot.children.count){ 
          completionHandler(userInside, nil) 
         } 
        }) 
       } 



      }) { (errorInside) in 
       completionHandler(nil, errorInside) 
      } 
     } 
+0

ご返信ありがとうございます。それは動作します:) – Brkr

+0

if(userFetched == snapshot.children.count)がエラーをスローします! – Learn2Code

+0

初期化中にuserFetchedの値を1に設定します。 var userFetched = 1 –

関連する問題