我是Firebase的新手,并试图从文件夹下载所有图像,同时尝试将它们保持在URL数组中的顺序。
我使用函数listAll
获取包含所有图像的引用数组,然后遍历它们,下载URL并将其插入itemImagesURL
数组中。当我们遍历所有图像后,将使用completionHandler
返回数组。
执行此操作的主要问题是,数组以错误的顺序填充了图像,因为下载URL(并将其附加到数组)的各项都不相同。
是否有一种方法可以下载每个项目的URL,并保持result.items
参考数组的原始顺序?
我的代码如下:
func getItemImages(completionHandler: @escaping ([URL?]) -> Void) {
var itemImagesURL: [URL] = []
// We retrieve all images using listAll
downloadRef.listAll(completion: { result, error in
if let error = error {
print("Error listing item images: ", error.localizedDescription)
return
}
itemImagesURL.reserveCapacity(result.items.count)
// We download every image's url
for index in 0 ..< result.items.count {
result.items[index].downloadURL(completion: { url, error in
if let error = error {
//Handle any errors
print("Error downloading item image: ", error.localizedDescription)
return
} else {
// Get download URL
itemImagesURL.insert(url!, at: index)
// All the urls of the item's images are retrieved -> we escape
if itemImagesURL.count == result.items.count {
print("Item's Images download finished.")
completionHandler(itemImagesURL)
}
}
})
}
}) // list all
}
}
答案 0 :(得分:0)
这是一个想法。我通常会发现我想将其他东西与图像一起存储,例如图像名称,图像本身,发布日期等,所以我希望有一个类来保存这些项目。
class ImageInfoClass {
var name = ""
var url = "some url"
var index: Int!
var image: Image()
}
然后,将它们存储在一个数组中-例如可以用作tableView的数据源。
var myImageArray = [ImageInfoClass]()
然后从存储中读取它们...读完最后一个,按索引排序即可设置。
func loadImagesAndSort() {
for (index, imageUrl) in result.items.enumerated() {
//perform download
// for each image that's downloaded, create a ImageInfoClass object
// and populate with the image, the index and a image name for example
let imageInfo = ImageInfoClass()
imageInfo.name = name
imageInfo.index = index
imageInfo.image = //the image
self.myImageArray.append(imageInfo)
if index == lastImageIndex {
self.myImageArray.sort(by: { $0.index < $1.index})
//print to show they are sorted
self.myImageArray.forEach { print($0.index, $0.name)}
}
}
}