2017-06-28 11 views
1

私のプログラムでは、子のすべてのインスタンスを配列に追加しようとしていますが、子を削除するたびに追加した子を2回複製し、何回何回削除して追加するかによって時間が変わります。追加と削除は主に以下の関数で処理され、なぜそれらが複製されているのかわかりません。Firebase .child追加されたオブザーバーが子を複製する

override func viewDidLoad() { 
    contactsTable.delegate = self 
    contactsTable.dataSource = self 
    contactsTable.rowHeight = 65 
    super.viewDidLoad() 
    fetchContacts(){ 
     self.contactsTable.reloadData() 
    } 
} 

func handleDelete(phone: String, completion: @escaping() ->()){ 
    let userRef = ref.child("users").child(user).child("contacts") 
    userRef.child(phone).removeValue { (error, ref) in 
     if error != nil { 
      print("Error: \(error)") 
     } 
     completion() 
    } 
} 

答えて

2

これは、メインスレッド上reloadData()を呼び出していない、あなたをどうすることがあります削除が処理され、機能がのviewDidLoadで呼ばれている方法のはここ

func fetchContacts(completion: @escaping() ->()){ 
    contacts = [Contact]() 
    let userRef = ref.child("users").child(user).child("contacts") 

    userRef.observe(.childAdded, with: { (snapshot) in 
     if let dictionary = snapshot.value as? [String: AnyObject]{ 
      print(snapshot) 
      let contact = Contact() 
      contact.setValuesForKeys(dictionary) 
      self.contacts.append(contact) 
     } 
     self.contactsTable.reloadData() 
     completion() 
    }, withCancel: nil) 

    userRef.observe(.childRemoved, with: { (snapshot) in 
     if let dictionary = snapshot.value as? [String: AnyObject]{ 
      let contact = Contact() 
      contact.setValuesForKeys(dictionary) 
      if let i = self.contacts.index(where: { $0.name == contact.name }) { 
       self.contacts.remove(at: i) 
      } 
     } 
     self.contactsTable.reloadData() 
     completion() 
    }, withCancel: nil) 
} 

です。代わりに、ただの

self.contactsTable.reloadData() 

試み:のviewDidLoadで

DispatchQueue.main.async { 
    self.contactsTable.reloadData() 
} 
+0

? –

+0

@BenCavenaghどこでも 'self.contactsTable.reloadData()'と呼ぶ –

+0

私はばかだ。私は誤ってfetchContacts関数を複数回呼び出していました。しかし、助けてくれてありがとう、あなたの答えは、私はその2番目の呼び出しを見つけるのを助けた。 –