iOS-如何使用“全部列出”顺序下载文件

时间:2019-10-15 18:24:37

标签: ios swift firebase firebase-storage

我是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
}

}

1 个答案:

答案 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)}
        }
    }
}