iOS - Как скачивать файлы по порядку, используя List All - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в 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 голосов
/ 15 октября 2019

Вот мысль. Я обычно нахожу, что я хочу хранить другие вещи с моим изображением, такие как имя изображения, само изображение, дата публикации и т. Д., Поэтому мне нравится иметь класс для хранения этих элементов.

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)}
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...