2017-03-05 14 views
0

これは非常に基本的な質問かもしれませんが、私はテーブルビューをリフレッシュしてFirebaseに追加された新しいアイテムのみを表示するにはどうしたらいいですか?Swift Firebase:UIRefreshControl with .childAdded

私は、テーブルビューのために 'プルするためのリフレッシュ'を実装し、テーブルビューにFirebaseに追加された新しいアイテムを設定しようとしています。 viewDidLoadでは、.observeSingleEvent(.value)を呼び出してテーブルを表示します。

リフレッシュ機能では、.observe(.childAdded)を呼び出します。しかし、そうすることで、アプリケーションは一貫して追加されたものをリッスンし、アプリケーションを一貫してreloadingDataにします。私が「リフレッシュする」ときにリフレッシュするようにコードを作成するにはどうすればよいですか?これまでの私のコード:

lazy var refresh: UIRefreshControl = { 
     let refresh = UIRefreshControl(frame: CGRect(x: 50, y: 100, width: 20, height: 20)) 
     refresh.addTarget(self, action: #selector(refreshData), for: .valueChanged) 
     return refresh 
    }() 

var eventsArray: [FIRDataSnapshot]! = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     ref = FIRDatabase.database().reference() 

     ref.child("events").observeSingleEvent(of: .value, with: { (snapshot) in 
      for snap in snapshot.children { 
       self.eventsArray.insert(snap as! FIRDataSnapshot, at: 0) 
      } 
      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 

     }) { (error) in 
      print(error.localizedDescription) 

     } 
    } 

    func refreshData() { 
     self.eventsArray = [] 

     ref.child("events").observe(.childAdded, with: { (snapshot) in 
      print(snapshot) 
      self.eventsArray.insert(snapshot, at: 0) 
      DispatchQueue.main.async { 
       self.refresh.endRefreshing() 
       self.tableView.reloadData() 
      } 
     }) { (error) in 
      print(error.localizedDescription) 

     } 
    } 

は私もobserveSingleEvent(.childAdded)を試みたが、それは唯一Firebaseから1つのエントリ(最上部のエントリを)引き出します。

私のアプローチが正しいかどうかはわかりません。どんな助言もここにpls、ありがとう。

答えて

0

あなたが子供を反復ループでは

var lastKey: String? = nil 

を追加しますが、現在のスナップのキーにlastKeyを設定します。

lastKey = snap.key 

これがうまくいくかどうか教えてください。

func refreshData() { 
    // Make sure you write a check to make sure lastKey isn't nil 
    ref.child("events").orderByKey().startAt(lastKey).observeSingleEvent(of: .value, with: { (snapshot) in 
     // You'll have to get rid of the first childsince it'll be a duplicate, I'm sure you can figure that out. 
     for snap in snapshot.children { 
      self.eventsArray.insert(snap as! FIRDataSnapshot, at: 0) 
     } 
     DispatchQueue.main.async { 
      self.refresh.endRefreshing() 
      self.tableView.reloadData() 
     } 
    }) { (error) in 
     print(error.localizedDescription) 

    } 
} 
+0

こんにちは!はい、それは動作します!ありがとう。 – Koh

+0

そこに、上記の方法は機能しますが、長期的には持続可能ではないかもしれません。ユーザーがイベントを削除して、laskKeyが削除されたことが判明した場合、アプリケーションがクラッシュする可能性があります。これを解決する良い方法はありますか? – Koh

+0

アプリがクラッシュすることはありますか?私はそれが結果を返さないか、単にそのキーをスキップするだけで、間違っているかもしれないと確信しています。あなたはそれを試しましたか? –

関連する問題