gpt4 book ai didi

swift - 仅在从 firebase 数据库 Swift 下载所有内容后才重新加载 TableView 数据

转载 作者:行者123 更新时间:2023-11-28 13:24:05 24 4
gpt4 key购买 nike

我已经找了一段时间了,但我不知道如何处理这个问题。我有一个 Firebase 数据库,其中包含一些数据和存储在存储中的图像链接。我希望我的 UICollectionView 在从数据库下载完每张图片后重新加载,而不仅仅是第一张。

newRef.observeSingleEvent(of: .value, with: { (snapshotOne) in
for child in snapshotOne.children {
let snap = child as! DataSnapshot
let key = snap.key

newRef.child(key).observeSingleEvent(of: .value, with: { (snapshotTwo) in
for child in snapshotTwo.children {
let snappotto = child as! DataSnapshot
var imageDownloaded: UIImage?

if let dictionary = snappotto.value as? [String : AnyObject] {
let url = URL(string: dictionary["imageURL"] as! String)
URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil {
print("[Error]: \(String(describing: error))")
return
}

imageDownloaded = UIImage(data: data!)

let person = Person(name: dictionary["name"] as! String, surname: dictionary["surname"] as! String, tags: [.castana], image: imageDownloaded!)
self.storedData.append(person)

self.filteredData = self.storedData

DispatchQueue.main.sync {
UIApplication.shared.endIgnoringInteractionEvents()
self.collectionView.reloadData()
self.dismiss(animated: false, completion: nil)
}

}.resume()
}
}
}) { (error) in
print("[Error]: \(String(describing: error))")
}
}
}) { (error) in
print("[Error]: \(error)")
}

这是我使用的代码,但这会在仅下载第一张图像后更新我的 UICollectionView,并随之结束 IgnoringInteractionEvents - 并允许用户一次又一次地重新加载数据,这会导致大量图像重复。

在下载完数据库中的每个项目后,如何移动重新加载和 endIgnoringInteractionEvents?

数据库结构如下:

| folder
-| user
--| autoId
---| name
---| surname
---| imageUrl
--|autoId
---| name
---| surname
---| imageUrl
-| user
--| autoId
---| name
---| surname
---| imageUrl

非常感谢,NicopDev

最佳答案

您在嵌套数据上嵌套观察者,这似乎是一种代码浪费。当您将观察者附加到某个位置时,该位置下的所有数据都已加载。

因此您可以循环遍历嵌套快照以获得相同的结果:

newRef.observeSingleEvent(of: .value, with: { (snapshot) in
for child in snapshot.children {
let userSnapshot = child as! DataSnapshot
let userKey = userSnapshot.key

for child in userSnapshot.children {
let imageSnapshot = child as! DataSnapshot
var imageDownloaded: UIImage?
...

说完这些,让我们继续讨论您的真正问题:您如何检测所有图像何时已加载。

一种简单的跨平台方法是简单地计算您已加载的图像数量,并将其与您知道存在的图像数量进行比较。由于您有一棵仅包含现有图像的树,因此您可以在双重嵌套结构的迭代中同时执行这两项操作

let knownImageCount = 0 // we start with no knowledge of any image
let loadedImageCount = 0 // we also haven't loaded any image yet

for child in snapshot.children {
let userSnapshot = child as! DataSnapshot
let userKey = userSnapshot.key

knownImageCount = knownImageCount + userSnapshot.childrenCount // we've found out about N more images

for child in userSnapshot.children {
let imageSnapshot = child as! DataSnapshot
var imageDownloaded: UIImage?
...

URLSession.shared.dataTask(with: url!) { (data, response, error) in

...

loadedImageCount = loadedImageCount + 1 // we loaded an additional image

if loadedImageCount == knownImageCount {
... // we've loaded all known images, we're done!
}
}.resume()

关于swift - 仅在从 firebase 数据库 Swift 下载所有内容后才重新加载 TableView 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58674524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com