我在一个页面上有两个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()
}
答案 0 :(得分:0)
我对Firebase API并不完全熟悉,但如果您遇到观察问题,我会怀疑以下情况:
@IBAction func unwindToRoomsVC(segue:UIStoryboardSegue) {
loadData()
}
第二次触发loadData
看起来会添加第二个观察区块。最好的我可以告诉.observe
方法可能会持续阻塞它并在所有更改时触发它。