2017-08-08 18 views
0

私は自分のアプリケーション内にフォーラムを作成しています。データベースのトピックをフェッチするときには、元のポスターのユーザー名などのユーザー情報もフェッチしてテーブルビューのセルに配置する必要があります。別のフェッチ内にFirebaseをフェッチする

Firebaseデータベースをフラットに保つことを推奨するために、私はキーで検索可能な別のリファレンスにメッセージを持ち、トピックの子ではありません。

ユーザーがユーザー名またはプロフィールの画像を変更した場合、参加したすべてのトピックで変更する必要があるため、opImageやopUsernameのようなものはトピックの子として保存できません。

これを処理する最善の方法は何ですか?

Firebaseからフェッチする方法は、次のようになります。この実装の問題は、Firebaseの呼び出しが非同期であり、イメージが正しいトピックにアタッチされるという保証がないことです。

DataService.ds.Topics_Base.child(cat.key!).observeSingleEvent(of:.value, with: { (snapshot) in 
     if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {//snapshots = all topics 

      for top in snapshots{ 

       if let dict = top.value as? Dictionary<String,AnyObject>{ 

        guard let title = dict["title"] as? String,let text = dict["text"] as? String,let time = dict["time"] as? String,let username = dict["username"] as? String,let timeSimple = dict["time-simple"] as? String,let lastPost = dict["last-post"] as? String,let open = dict["open"] as? Bool else{ 
         continue 
        } 

        let newTopic = Topic(subject: title, text: text, time: time, topicKey: top.key, username: username) 

        self.allTopics.append(newTopic) 
        print(self.allTopics.count) 

        if let email = dict["email"] as? String{ 
         //FETCH USER INFO FROM EMAIL FETCHED 
         let validEmail = HelperMethods.removeSpecialCharactersFromEmail(email: email) 
         DataService.ds.Users_Base.child(validEmail).observeSingleEvent(of: .value, with: {(snapshot) in 
          if let userDict = snapshot.value as? Dictionary<String,AnyObject>{ 
            if let imgUrl = userDict["profile_image_url"] as? String{ 
            self.allTopics[currentIndex].opImageUrl = imgUrl 
           } 

           self.allTopics.append(newTopic) 


           if (totalTopics == snapshots.count){ 
            DispatchQueue.main.async { 
             self.allTopics.sort { $0.lastPostTime! > $1.lastPostTime!} 
             self.tableView.reloadData() 
             self.refreshControl.endRefreshing() 
            } 
           } 
          } 
         }) 
        } 
       }   } 
     } 
    } 
    ) 
} 

ありがとうございます。

答えて

0

すべてのトピックをフェッチした後、トピック配列をループしてトピックごとにユーザー情報を添付した後に、ユーザー情報を取得することになりました。

例:

1 - すべてのトピックを取得し、アレイ

2を作成 - 各トピックの配列における{

topic.emailセットのようなプロパティを使用してFirebaseにユーザをフェッチ次のようなもの:

topic.imageUrl = user.imageUrl

topic.username = user.username

}

リロードテーブルビュー

関連する問題