2017-10-14 2 views
1

FireBaseからデータを取得し、ローカルに保存してUITableViewにロードする方法があります。それは素晴らしい仕事です。サーバswiftから配列の変更が更新されました

ここで、このオブザーバー(rootGenerals.observe())は、サーバーでデータが変更されるたびにライブで更新されています。

私の問題は、新しいデータを取得したら(今のように)テーブル全体をリロードするのではなく、テーブル内の特定の変更された行を更新するだけで、 IndexPath)を設定します。

どうすればいいですか?その状況での処理の最善の方法は何かに関するガイダンスが必要です。

rootGenerals.observe(.value, with: { snapshot in 
     if !snapshot.exists() { return } 

     let general = snapshot.value as! NSDictionary 

     if let users : NSDictionary = general.object(forKey: "users") as? NSDictionary 
     { 
      if (self.usersFromDB?.count != 0) { 
       // Update table rows 
       self.arrRecords = [] 
      } 
      else { 
       // Create table from scratch 
       self.usersFromDB = users 

       for user : Any in users.allKeys { 
        let userDict : NSDictionary = users.object(forKey: user as! String) as! NSDictionary 
        let record : Record = Record() 

        record.displayName = userDict.object(forKey: "name") as! String 
        record.time   = userDict.object(forKey: "time") as! Int 
        record.solvedLogos = userDict.object(forKey: "logos_solved") as! Int 
        record.deviceId  = userDict.object(forKey: "device_id") as! String 
        record.raw   = userDict 

        self.arrRecords.append(record) 
       } 

       self.sortRecords() 
      } 
     } 
    }) 
+0

私は、あなたが指定した参照の子が更新または変更されたときにいつでも '.childChanged'イベントタイプを使用して検出できると思います – 3stud1ant3

答えて

0

あなたが特定のインデックスパスを使用して、テーブルの使用中のインサートを新しい行の

tableView.reloadRows(at: your_indexpath_array, with: your_Animation) 

を更新したい場合は

tableView.beginUpdates() 
tableView.insertRows(at: your_indexpath_array, with: your_Animation) 
tableView.endUpdates() 
+0

ありがとうございます、私が尋ねたものではありません..質問を読んでください、 UITableViewセル –

0

は、この使用してみてください:そう

rootGenerals.observe(.childAdded, with: { snapshot in 
    //your code 
}) 

新しい子ユーザが追加されるたびに、n ew data

+0

しかし、子が更新され、追加されない場合はどうなりますか?サーバーで更新されたものと、テーブルビューに含まれている同じ行との間で同期する最善の方法は何ですか? –

+0

あなたのアプリを実行すると、最初にあなたのfirebaseにあるすべての子が読み込まれます。コードがすでに実行されている間に新しい子が追加されると、新しい子のみが読み込まれます。次に、テーブル全体をリロードするか、テーブルに新しい行だけを挿入することができます。子供の更新については、変更された子供にとって特別な方法があります。私はすべての質問に答えることを願っています。公式の文書https://firebase.google.com/docs/database/ios/lists-of-dataからすべての方法を見つけることができます。 –

関連する問題