我在显示有关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
方法可能持久化给定的块,并在所有更改时触发它。