【发布时间】:2020-02-28 15:41:20
【问题描述】:
我一直在寻找一段时间,但我不知道如何处理这个问题。 我有一个 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
【问题讨论】:
-
您的问题是说您正在使用存储 - 这是否意味着 Firebase 存储?如果是这样,你为什么要使用这个
URLSession.shared.dataTask(with: url!)?使用Firebase Storage 可以简化代码。此外,您可以创建一个 Dispatch 组并将每个下载添加到该组。当它们都完成后, group.notify 会触发,指示所有任务都已完成。
标签: swift firebase firebase-realtime-database firebase-storage