どうも、Tiktok太郎です!
今夏リリース予定の次世代チャットアプリを作っています。
中高生の間で一世風靡させルために、
助けてください。。。
コードが汚くて、かつ拙い説明で伝わるかどうかとても不安ですが、
何卒よろしくお願いいたします。
TableViewに、友達登録している人だけを表示させるところで詰まっています。
【大まかな流れ】
ContactsVCクラスでgetContacts関数を呼び出す。
getContacts関数内で、Firebaseから、全登録ユーザーの名前やID情報を取得する。
そのうち、現在ログインしているユーザーの友達として登録されてる人の分の情報だけを、Contactクラス配列に入れる。
それをContactsVCクラスで、tableViewに表示させる。
【問題】
コードが思った通りの順番で実行してくれない。
以下記載のコードで、
Step1 → Step2(必要な情報をContact配列に代入) → Step3(Table View表示)
の順で動いて欲しいが、Step1 → Step3 → Step2の順番で実行される。
最後のStep2まで実行されると、Contact配列の中にちゃんと必要な情報が入っているが、
Contact配列が空のままで、必要な情報が代入される(Step2)前にtableView表示(Step3)に進んでしまうので、何も表示されない。。。
Firebase上の構造は以下画像のようになっています
Swift
1//ContactsVCクラス 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 DBProvider.Instance.getContacts(); 6 } 7 8 9 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 10 print("step3") 11 return contacts.count; 12 }
//DBProviderクラス func getContacts() { //以下、Firebaseから全ユーザーの情報を取りに行く Database.database().reference().child("Contacts").observeSingleEvent(of: DataEventType.value) { (snapshot: DataSnapshot) in var contacts = [Contact](); if let myContacts = snapshot.value as? NSDictionary{ for (key, value) in myContacts { if let contactData = value as? NSDictionary { if let name = contactData[Constants.NAME] as? String { let profileImageUrl = contactData[Constants.PROFILE_IMAGE] as! String let id = key as! String; let newContact = Contact(id: id, name: name, profileImageUrl: profileImageUrl); let friendusername3 = contactData["username"] as! String print("step1") //以下、Firebaseから現在ログインしてるユーザーの友達登録されているユーザーの情報を取りに行く var uid = Auth.auth().currentUser?.uid Database.database().reference().child("Contacts").child(uid!).child("friendusername").observeSingleEvent(of: .value, with: { (snapshot) in if let c = snapshot.value as? [String:AnyObject]{ let myFriendUserName = c[id] as? String if myFriendUserName != nil { //現在ログインしてるユーザーの友達として登録されているユーザー名(myFriendUserName)と、他の全登録ユーザーのユーザー名が一致したとき、 if myFriendUserName! == friendusername3 { contacts.append(newContact) print("step2") } } } }) } } } } //contactsVCのdatareceived func を呼ぶ self.delegate?.dataReceived(contacts: contacts); } } //getContact関数終わり
class Contact { private var _name = ""; private var _id = ""; private var _profileImageUrl = ""; init(id: String, name: String, profileImageUrl: String) { _id = id; _name = name; _profileImageUrl = profileImageUrl; } var name: String? { get { return _name; } } var id: String? { return _id; //上のgetterの省略版 } var profileImageUrl: String? { return _profileImageUrl; //上のgetterの省略版 } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/08 08:00
2018/07/08 08:12 編集
2018/07/11 15:04
2018/07/11 15:52 編集
2018/07/11 17:09 編集
2018/07/12 05:47
2018/07/14 12:09