2017-11-06 18 views
1

これは数時間前です。私の問題の解決策を見つけるためにインターネットフォーラムを掘り下げようとしています。何が起きているのか理解できないので、 )Firebaseデータベース内のデータがobserveSingleEventで2回読み込まれる

私は迅速なアプリケーションを持っています。私のビューコントローラの1つでは、Firebaseデータベースからデータを取得して、それらをテーブルビューに表示したいと考えています。

私のデータがどのように整理されているかを見ることができます。 Firebase org of data

が私のテーブルビュー内の行数を取得するには、私はこの

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     print("Number of contact TV: \(numberOfContact)") 
     return numberOfContact 
    } 

とTOを持って、行数を取得するには、

override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     // Count the number contacts to get the correct number of lines in the table 

     let ref_table = ref.child("users").child((user?.uid)!).child("emergencyContacts") 
     print("Starting observing") 
     ref_table.observe(.value, with: { (snapshot: DataSnapshot!) in 
      print("Got snapshot") 
      print(snapshot.childrenCount) 
      let count = snapshot.childrenCount 
      self.numberOfContact = Int(count) 
      self.UI_contactsTableView.reloadData() 
      ref_table.removeAllObservers() 
     }) 
     print("Returning count") 
    } 

そして、viewWillAppearセクションにこれを入れます私のテーブルビューのセルを埋める

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "contact-cell") as! EmergencyContactCell 
     print("value of numberOfContact \(numberOfContact)") 
     ref.child("users").child((user?.uid)!).child("emergencyContacts").observeSingleEvent(of: .value, with: { (snapshot: DataSnapshot) in 
       print("snapshot value \(snapshot.value!)") 

       for rest in snapshot.children.allObjects as! [DataSnapshot] { 
        guard let restDict = rest.value as? [String:Any] else { continue } 
        let firstName = restDict["contact_firstName"] as? String ?? "" 
        cell.UI_fullName.text = "\(firstName)" 
       } 
      }) 
     return cell 
    } 

そして私はこれが悪い私が何をしていても、私はいつも2セットのデータを表示しているので、私のセルは常にhereと同じ名前で埋められています。

これはプログラム実行後の私のコンソールのキャプチャです。あなたの助けを事前に

Starting observing 
Returning count 
Number of contact TV: 0 
Number of contact TV: 0 
Number of contact TV: 0 
Got snapshot 
2 
Number of contact TV: 2 
value of numberOfContact 2 
value of numberOfContact 2 
snapshot value { 
    1ArkUu6pMPZPgf3pGFAvvxHiTPFaf5Cl =  { 
     "contact_firstName" = Kate; 
     "contact_lastName" = Bell; 
     "contact_phoneNumber" = "(555) 564-8583"; 
    }; 
    s8haDrYYAT9Y12ZnmAfE87pDyjDZGwjx =  { 
     "contact_firstName" = Daniel; 
     "contact_lastName" = Higgins; 
     "contact_phoneNumber" = "555-478-7672"; 
    }; 
} 
snapshot value { 
    1ArkUu6pMPZPgf3pGFAvvxHiTPFaf5Cl =  { 
     "contact_firstName" = Kate; 
     "contact_lastName" = Bell; 
     "contact_phoneNumber" = "(555) 564-8583"; 
    }; 
    s8haDrYYAT9Y12ZnmAfE87pDyjDZGwjx =  { 
     "contact_firstName" = Daniel; 
     "contact_lastName" = Higgins; 
     "contact_phoneNumber" = "555-478-7672"; 
    }; 
} 

感謝:)

+0

申し訳ありませんが、それはひどく私のセルを埋めるのはなぜですか? – schtipoun

答えて

0

私はそれを理解しましたが、私は全く異なる推論を試みました。私は実際にすべてを管理するためにハンドラを使用しました。私はここに私のコードを掲載し、それは私が数時間前と同じ問題の人々を助けることができます。

var emergencyContactList = [EmergencyContact]() 


override func viewDidLoad() { 
     super.viewDidLoad() 
     ref = Database.database().reference() 
     fetchUsers() 
    } 

func fetchUsers() { 
     refHandle = ref.child("users").child((user?.uid)!).child("emergencyContacts").observe(.childAdded, with: { (snapshot) in 
      if let dictionary = snapshot.value as? [String:AnyObject] { 
       print(dictionary) 
       let emergencyContact = EmergencyContact() 
       emergencyContact.setValuesForKeys(dictionary) 
       self.emergencyContactList.append(emergencyContact) 
       DispatchQueue.main.async { 
        self.UI_contactsTableView.reloadData() 
       } 
      } 
     }) 
    } 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return emergencyContactList.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "contact-cell") as! EmergencyContactCell 
     let _firstName = emergencyContactList[indexPath.row].contact_firstName ?? "" 
     let _lastName = emergencyContactList[indexPath.row].contact_lastName ?? "" 
     let _phoneNumber = emergencyContactList[indexPath.row].contact_phoneNumber ?? "" 
     cell.UI_fullName.text = "\(_firstName) \(_lastName)" 
     cell.UI_phoneNumber.text = "\(_phoneNumber)" 
     return cell 
    } 

そして私はEmergencyContact.swift

import Foundation 

class EmergencyContact: NSObject { 
    @objc var contact_firstName:String? 
    @objc var contact_lastName:String? 
    @objc var contact_phoneNumber:String? 
} 

今では魔法のように動作離れて迅速なファイルを持っています! ありがとうございましたTheAppMentor私に答えて時間がかかったため:

0

エラーがcellForRowAtIndexパス方式です。

`ref.child("users").child((user?.uid)!).child("emergencyContacts").observeSingleEvent(of: .value, with: { (snapshot: DataSnapshot) in' 

上記の行は、cellForRowAtIndexPathメソッドが呼び出されるたびにすべての緊急連絡先を返します。

forループでは、常にループスルーして最後の値を選択します。

特定のインデックスパスの値を抽出する必要があります。

関連する問題