(復元要請がありましたので復元いたします)
以前にも同じ質問をしたのですが、
https://teratail.com/questions/138971
非同期処理を実施しておらず、
質問以前の段階でしが、
非同期処理を理解できたので(おそらく)
もう一度不明点を整理しました。
仕様
ユーザーは
イベントを投稿して
そのイベントに対してコメントをつけられる。
RealtimeDataBaseには、EventとCommentとして保存される
イベントとコメントはtableviewCellで並ぶ
コメントはイベントと紐づいたものとして取得したい
そんなイメージのアプリです
ツリー
{ Events{ 0{ eventName:"hogehoge" Comments{ 0:true } } 1{ eventName:"hogehoge" Comments{ 1:true 2:true } } } Comments{ 0{ text:"hogehoge" Events{ 0:true } } 1{ text:"hogehoge" Events{ 1:true } } 2{ text:"hogehoge" Events{ 1:true } } } }
前回の質問でアドバイスいただいた非同期処理
コールバックを使った
Eventのみの取得はできるようになりました。
しかし本命である、Eventに紐づいたCommentの取得がうまくできません。
EventのIDを使って、Commnt{Event}を取得したいのですが
うまくいきません。
CommentManager.swift
import UIKit import Firebase class CommentManager: NSObject { static let sharedInstance = CommentManager() //ここでエラーが出てしまう var comments: [Comment] = [] var items = [NSDictionary]() var getEventID: String init(getEventID: String) { self.getEventID = getEventID } func fetchComments(callback: @escaping () -> Void) { let firebase = Database.database().reference(fromURL: "hogehoge").child("Events") var tempItems = [NSDictionary]() firebase.child(getEventID).child("Comments").observe(.value){ (snapshot,error) in for item in (snapshot.children){ let key: String = (item as AnyObject).key firebase.child("Comments").child(key).observe(.value){ (snapshot,error) in let value = snapshot.value as? NSDictionary tempItems.append(value!) } } self.items = tempItems self.items = self.items.reversed() callback() } } }
CommentListViewController.swift
import UIKit import Firebase class CommentOfEventListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { let commentManager = CommentManager.sharedInstance var getEventID = String() 省略 override func viewDidLoad() { super.viewDidLoad() commentManager.items = [NSDictionary]() 省略 commentListTable.delegate = self commentListTable.dataSource = self getCommentsRdbData() commentListTable.reloadData() } func numberOfSections(in tableView: UITableView) -> Int{ return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //return 10 return commentManager.items.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "commentCell", for: indexPath) cell.selectionStyle = UITableViewCellSelectionStyle.none let dict = commentManager.items[(indexPath as NSIndexPath).row] let commentTextView = cell.viewWithTag(1) as! UITextView commentTextView.text = dict["text"] as? String return cell } func getCommentsRdbData(){ UIApplication.shared.isNetworkActivityIndicatorVisible = true //getEventIDをCommentManager.swiftのinitに渡したい let comment = CommentManager(getEventID: getEventID) //comment.fetchComments() //getEventIDを渡しながらコールバックしたいのですが・・・書き方がわからない commentManager.fetchComments { () in self.eventListTable.reloadData() } UIApplication.shared.isNetworkActivityIndicatorVisible = false } }
CommentListViewController.swiftにEventIDは渡せているので
それをCommentManagerにわたして
紐づいたCommentを見つけたいです。
アドバイスよろしくお願いします
回答1件
あなたの回答
tips
プレビュー