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

添加照片并点击提交后,照片会在后台上传到Firebase存储中,并在Firebase数据库中更新记录,以包括刚刚上传的文件的名称。同时,用户被锁定回到“房间”视图。

在Firebase中,房间的记录受到监视,当它更新时,视图将用新数据刷新。这是发生问题的地方。根据我一直在进行的大量调试,似乎Observ方法会触发两次,最终结果是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()
}

最佳答案

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

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


第二次触发loadData似乎将添加第二个观察块。尽我所能告诉.observe方法可能持久化给定的块,并在所有更改时触发它。

10-04 23:07
查看更多