2017-01-17 11 views
0

firebaseデータベースに新しいデータを追加するとアプリに重複して表示されるのはなぜですか?プロジェクトシミュレータにデータがどのように表示されるかのスクリーンショットを作成します。これはプロジェクトにデータが表示される方法です。 1Firebaseデータベースに新しく追加されたデータが自己複製してSwift3を使ってリフレッシュする前に複製

これは私のコードです。

import UIKit 
import FirebaseDatabase 
import SDWebImage 
import FirebaseAuth 


class ViewController: UIViewController , UITableViewDataSource , UITableViewDelegate { 


@IBOutlet weak var tableView: UITableView! 

var Ref:FIRDatabaseReference? 

var Handle:FIRDatabaseHandle? 

var myarray = [Posts]() 

var refresh = UIRefreshControl() 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = self 
    tableView.dataSource = self 

    refresh.addTarget(self, action: #selector(ViewController.loadData), for: .valueChanged) 

    tableView.addSubview(refresh) 


} 

override func viewDidAppear(_ animated: Bool) { 

    loadData() 

    } 



func loadData(){ 

    self.myarray.removeAll() 

    Ref=FIRDatabase.database().reference() 

    Handle = Ref?.child("Posts").queryOrdered(byChild: "Des").queryEqual(toValue: "11").observe(.childAdded ,with: { (snapshot) in 

     if let post = snapshot.value as? [String : AnyObject]{ 

      let img = Posts() 

      img.setValuesForKeys(post) 

      self.myarray.append(img) 

      print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\(img)") 

      self.tableView.reloadData() 
     } 


    }) 
     self.refresh.endRefreshing() 

} 
+0

投稿を追加する場所にコードを表示できますか? –

+0

データベースコンソールから直接追加しています。 –

+0

'.childAdded'の代わりに' .value'を使用しようとしましたか? –

答えて

1

self.refresh.endRefreshing()がFirebaseクロージャの外側で呼び出されているようです。

これは、Firebaseがデータを返してtableViewデータをリロードする前にコードが実行されるため、これは悪いことです。

Firebaseは非同期で、インターネットがFirebaseサーバからアプリケーションにデータを取得するのに時間がかかることを覚えておいてください。通常、インラインコードはクロージャのコードより前に実行されます。

また、他の場所で使用していない限り、ハンドルは不要です。あなたが任意の時間にFirebaseノード(.childAdded)にそれが追加された子をオブザーバを追加するときに、あなたのテーブルビューが自動的原因で実行されるコードに更新されますよう

Ref?.child("Posts").queryOrdered(byChild: "Des").queryEqual(toValue: "11") 
        .observe(.childAdded ,with: { (snapshot) in 
    if let post = snapshot.value as? [String : AnyObject]{ 
     let img = Posts() 
     img.setValuesForKeys(post) 
     self.myarray.append(img) 
     print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\(img)") 
     self.tableView.reloadData() 
    } 
    self.refresh.endRefreshing() 
}) 

また、あなただけの完全リフレッシュを削除することを検討します閉鎖。

+0

助けてくれてありがとう、私は私のプロジェクトからリフレッシュを削除したくない、私はあなたの答えのようにそれを行うが、同じエラーデータが重複して表示されます。 –

+0

@ ZaidMustafaなぜこの場合、爽快感を使っていますか? tableView.reloadDataを呼び出すと、tableViewがリフレッシュされます。おそらく、エラーはtableViewデリゲートメソッドにありますか?それらを質問に追加できますか? – Jay

関連する問題