我正在尝试为以下场景找到正确的方法:
我有UICollectionView
显示对象(具有UNIQUE ID)。每个用户都可以“修改”对象,因此显然所有其他用户在同一时刻都需要看到这种变化。
问题是这个,我应该听这个对象的父Value
,它包含所有对象(这听起来像是浪费了“请求时间”,因为有时用户会听取更改他们不需要(如果过滤了collectionView),或者我应该设置一堆(单个)侦听器,只针对当前需要的“特定”对象?
谢谢!
答案 0 :(得分:3)
您可以使用子事件处理对单个子节点的更新。
// save updates a dictionary with the snapshot key
// being the dictionary key
var items = [String: FDataSnapshot]()
let ref = Firebase(url: "<my-firebase-app>")
// listen to various child events and update the data source
ref.observeEventType(.ChildAdded) { (snap: FDataSnapshot!) in
items[snap.key] = snap
}
ref.observeEventType(.ChildChanged) { (snap: FDataSnapshot!) in
items[snap.key] = snap
}
ref.observeEventType(.ChildRemoved) { (snap: FDataSnapshot!) in
items.removeValueForKey(snap.key)
}
...我应该听这个包含的对象的父值 所有的对象(听起来像浪费“请求时间”
不考虑请求非常重要。 Firebase使用WebSockets。一旦建立了WebSocket,它就会与服务器保持持久连接。在套接字之间来回发送数据需要很少的开销。
But, I would actually use FirebaseUI ,这是一个用于将Firebase数据同步到UITableView和UICollectionView的库。
let firebaseRef = Firebase(url: "https://<YOUR-FIREBASE-APP>.firebaseio.com/")
let dataSource: FirebaseCollectionViewDataSource!
...
self.dataSource = FirebaseCollectionViewDataSource(ref: self.firebaseRef, cellReuseIdentifier: "<YOUR-REUSE-IDENTIFIER>", view: self.collectionView)
self.dataSource.populateCellWithBlock { (cell: UICollectionViewCell, obj: NSObject) -> Void in
let snap = obj as! FDataSnapshot
// Populate cell as you see fit, like as below
cell.backgroundColor = UIColor.blueColor()
}
self.collectionView.dataSource = self.dataSource