2017-07-27 60 views
0

我有一个UICollectionViewController,它充当从我的Firebase数据库检索并显示数据的提要。它是窗口的根视图控制器,所以它始终存在。我的问题是,每次出现控制器时,所有来自其观察节点的孩子都会被添加到收集视图中。这最初是好的,但是当我离开控制器并返回时,所有相同的数据都会被追加,从而产生重复。下面是一些伪代码,较火力地堡我互动:Swift Firebase使用.child添加检索重复数据

class ViewController: UIViewController { 

    var children_query: DatabaseQuery! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.children_query = Database.database().reference().child("children").queryOrdered(byChild: "timestamp").queryStarting(atValue: Date().timeIntervalSince1970) 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     self.observeAddedChildren() 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 
     self.children_query.removeAllObservers() 
    } 

    func observeAddedChildren() { 
     self.children_query.observe(.childAdded, with: { snapshot in 
      print(snapshot.value) 
     }) 
    } 

} 

在这个伪代码,而不是处理UI,我只需打印snapshot,但点保持。每次出现控制器时,所有孩子都会打印。我怎样才能检索只有尚未检索的数据?谢谢。

回答

0

我还没有使用Firebase,但是当您将一个块传递给observe函数时,没有什么可以暗示当视图消失时停止观察。

所以我不知道是否多次打电话observe是问题。你有没有试过在ViewDidLoad中调用observe一次?

另外,有一个属性来记录观测是否已经启动:

var observing: Bool = false 

func observeAddedChildren() { 
    if observing { 
     return false 
    } 

    self.children_query.observe(.childAdded, with: { snapshot in 
     print(snapshot.value) 
    }) 
    observing = true 
} 

编辑:这里有一对夫妇更多的方式,因为你可能添加snapshot项目数组或其他集合,那么你的UICollectionViewDataSource正在读取该数组中的东西。

因此,要么:

  1. 空数组里面viewWillAppear,然后调用self.collectionView.reloadData(),或
  2. 如果您snapshot对象都有一个唯一的标识符属性,然后把这个放到一个数组,然后观察块可以

    var snapshotIDs : [String] = Array<String>() 
    
    func observeAddedChildren() { 
        self.children_query.observe(.childAdded, with: { snapshot in 
         if !snapshotIDs.contains(snapshot.uniqueID) { 
          print(snapshot.value) 
          snapshotIDs.append(snapshot.uniqueID) 
         } 
        }) 
    } 
    
    :之前

像这种无视它已经看到的项目

+0

那么我调用'viewWillDisappear'中的'self.children_query.removeAllObservers()',最终我不想在视图不可见时继续观察。但好主意;我可能能够解决这个问题。 –

+0

我明白了。但是,如果你调用'removeAllObservers',然后'观察'当视图再次可见时,你正在观察的事物不知道你已经添加了一些项目到你的收藏视图。因此,无论是(1)从'viewWillAppear'的集合视图中删除所有项目,或者(2)_you_必须跟踪哪些项目已被添加(可能在数组中),并且如果在观察者中再次看到它们,块。 – Matthew

+0

@ArchieGertsman见编辑答案 – Matthew