以下のプログラムでFirebase Realtime Databaseから配列を取得し、TableViewを動的に更新しているのですが、データベース上にある元々の配列が更新された瞬間に変数が一瞬の間に大量に更新されてしまっています。
Swift4
1override func viewDidLoad() { 2 super.viewDidLoad() 3 //インスタンスを作成 4 DBRef = Database.database().reference() 5 6 //繰り返し 7 Timer.scheduledTimer( //TimerクラスのメソッドなのでTimerで宣言 8 timeInterval: 1, //処理を行う間隔の秒 9 target: self, //指定した処理を記述するクラスのインスタンス 10 selector: #selector(self.newArray(_:)), //実行されるメソッド名 11 userInfo: nil, //selectorで指定したメソッドに渡す情報 12 repeats: true //処理を繰り返すか否か 13 ) 14 15 } 16 17 @objc func newArray(_ sender: Timer) { //(_ sender: Timer) Timerクラスのインスタンスを受け取る 18 self.hogearray = [] 19 let defaultPlace = DBRef.child("table/orderorder") 20 defaultPlace.observe(.value, with: { snapshot in 21 for item in (snapshot.children) { 22 let snapshot = item as! DataSnapshot 23 let dict = snapshot.value as! String 24 self.hogearray.append(dict) 25 } 26 print (self.hogearray) 27 28 DispatchQueue.main.async { 29 self.tableView.reloadData() 30 } 31 32 }) 33 }
printしたデータの一部は以下です。(元々["2", "4", "3"]が格納されていた配列に要素["9"]を足した例)
["2", "4", "3"] ["2", "4", "3"] ["2", "4", "3"] ["2", "4", "3"] ["2", "4", "3"] ["2", "4", "3"] ["2", "4", "3"] ["2", "4", "3"] ["2", "4", "3"] ["2", "4", "3", "2", "4", "3", "9"] ["2", "4", "3", "2", "4", "3", "9", "2", "4", "3", "9"] ["2", "4", "3", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9"] ["2", "4", "3", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9"] ["2", "4", "3", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9"] ["2", "4", "3", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9"] ["2", "4", "3", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9"] ["2", "4", "3", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9", "2", "4", "3", "9"]
数秒経つと正しい結果["2", "4", "3", "9"]に戻るのですが、原因はどこにあるのでしょうか。
追記:["002","006"]に要素["004"]を足した例
@["002", "006"]@ @["002", "006"]@ @["002", "006"]@ @["002", "006", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004", "002", "006", "004"]@ @["002", "006", "004"]@ @["002", "006", "004"]@ @["002", "006", "004"]@
追記
@["002", "006", "004", "004"]@ @["002", "006", "004", "004"]@ @["002", "006", "004", "004"]@ @["002", "006", "004", "004", "002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007", "002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "007"]@ @["002", "006", "004", "004", "007"]@
追記
hoge @["002", "006", "004"]@ hoge @["002", "006", "004"]@ hoge @["002", "006", "004"]@ @["002", "006", "004", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008"]@ @["002", "006", "004", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008", "002", "006", "004", "008"]@ hoge @["002", "006", "004", "008"]@ hoge @["002", "006", "004", "008"]@
print("@\(self.hogearray)@") に変えて出力を教えて下さい。
編集させていただいた通りの結果になりました。
forからprintまで、全部 DispatchQueue.main.async { の中に入れるとどうなりますか?
もう一度追記した通りです。繰り返される回数が減り、動作が早くなった(軽くなった)感じがしますが、まだ代入は止まらないようです。
期待したような結果にならなかったのでコードは元に戻しておいて下さい。で、newArray(_:)の呼び出し間隔を5秒にするとどうなりますか?
全く同じ結果でしたが、異常な値が出ている行は要素の追加直後にいっぺんに出力され、それから5秒経って更新後の正しい値が出力されました。
一回のnewArray(_:)の処理時間ってどれくらいか分かりますか?
例えば今回の例ではどの行もきっちり5秒おきに出力されたので、異常があるときも特に処理時間はかかっていないように思います。
newArray(_:)の先頭にprint文を追加して、そのprint文の出力とprint (self.hogearray)の間に、次のnewArray(_:)が呼び出されていないか確認してみて下さい。
編集させていただいた通り、異常のある処理の中でnewArray(_:)は一度しか呼び出されていないようです。forループの中でのエラーということでしょうか…
どうも思っていたのと違うみたいで、observeが何をしているかも分からないのでちょっとお手上げですね。
そうですか… お力添え頂き、ありがとうございました。
今度からFirebaseの質問には Firebase のタグ付けましょう。(この質問も付けていたらすぐに解決していたはず)
回答1件
あなたの回答
tips
プレビュー