如何在Firebase更新后阻止UICollectionView显示重复的项目

时间:2017-12-24 23:24:20

标签: ios swift firebase firebase-realtime-database

我在一个页面上有两个UICollection视图,显示有关Room的数据。它包括一个UICollection视图中的房间照片和另一个包含该房间中项目列表的UICollection视图。有一个编辑房间的链接。当用户点击该链接时,他们会转到另一个视图,让他们更新它,包括添加其他照片。

添加照片并点击提交后,在后台将照片上传到Firebase存储空间和Firebase数据库中,记录将更新为包含刚刚上传的文件的名称。同时,用户被重新调回房间视图。

Firebase中的房间记录中有人观看,当它更新时,视图会刷新新数据。这是问题发生的地方。看来,根据我一直在做的很多调试,Observe方法触发两次以及最终发生的事情,是保存房间图像的UICollection视图将显示最后添加的照片的重复。

例如,如果我将一张照片添加到房间,该照片将显示在集合2x中。我已经尝试在使用图像更新数组之前清除数组,并且从我的分析中看来,尽管在视图中显示了三个,但数组似乎只包含两个项目。我不确定会导致这种情况发生了什么?

Here's a link to the entire file,因为我觉得它可能有所帮助。

这是loadData()方法,以防这一切都很重要:

func loadData() {
    self.ref = Database.database().reference()
    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
    guard let userID = Auth.auth().currentUser?.uid else { return }

    let buildingRef = self.ref.child("buildings").child(userID)

    buildingRef.keepSynced(true)

    buildingRef.child(self.selected_building as String).observe(DataEventType.value, with: { (snapshot) in

        let value = snapshot.value as? NSDictionary

        if ((value) != nil) {
            let building_id = value?["id"] as! String
            let saved_image = value?["imageName"] as! String
            let user_id = userID as! String
            let destination = "/images/buildings/\(userID)/\(building_id)/"
            let slideShowDictionary = value?["images"] as? NSDictionary

            if ((slideShowDictionary) != nil) {
                self.slideShowImages = [UIImage]()
                self.slideShowCollection.reloadData()
                var last_value = ""
                slideShowDictionary?.forEach({ (_,value) in
                    print("are they different? \(last_value != (value as! String))")
                        if (last_value != value as! String) {
                            print("count: \(self.slideShowImages.count)")
                            print("last_value \(last_value)")
                            print("value \(value)")
                            last_value = value as! String
                            CloudStorage.instance.downloadImage(reference: destination, image_key: value as! String, completion: { (image) in
                                self.slideShowImages.append(image)
                                self.slideShowCollection.reloadData()
                            })

                        }
                })

                CloudData.instance.getBuildingById(userId: user_id, buildingId: building_id, completion: { (building) in
                    self.title = building.buildingName as String
                    self.roomsCollection.reloadData()
                })
            }
        }
    })

    // User is signed in.
    self.getRooms()
}

1 个答案:

答案 0 :(得分:0)

我对Firebase API并不完全熟悉,但如果您遇到观察问题,我会怀疑以下情况:

@IBAction func unwindToRoomsVC(segue:UIStoryboardSegue) {
        loadData()
    }

第二次触发loadData看起来会添加第二个观察区块。最好的我可以告诉.observe方法可能会持续阻塞它并在所有更改时触发它。