Получить несколько фотографий под узлом из Firebase Storage

У меня есть CollectionView, который я использую изображения из Firebase Storage для заполнения. Я храню изображения под узлом 'userId'. Я хочу проверить наличие файлов оптом, которые доступны в узле, чтобы я мог хранить их в массиве.

Я пытался получить URL-адреса отдельно для каждого, однако я считаю, что это очень неправильный подход. Но я не мог понять, как сделать это наиболее эффективным способом и куда поставитьcollectionView.reload(), Вот что я сделал:

let storage = FIRStorage.storage()
let firstImageRef = storage.referenceForURL("gs:storageUrl").child(uid).child("profile.jpg")

firstImageRef.downloadURLWithCompletion { (URL, error) -> Void in
   if (error != nil) {
       print(error)
   } else {
       if let url = URL {
         self.databaseImagesOrder.append(url)
       }
   }
}

let secondImageRef = storage.referenceForURL("gs:storageUrl").child(uid).child("second_pic.jpg")
secondImageRef.downloadURLWithCompletion { (URL, error) -> Void in
   if (error != nil) {
      print(error)
   } else {
      if let url = URL {
        self.databaseImagesOrder.append(url)
      }
   }
 }

 // etc.. 

 collectionView.reloadData()

Кроме того, лучше ли получать изображение как NSData лучше, чем сначала получать URL-адреса, а затем получать изображения? Если это так, как я могу получить изображения в массе из Firebase Storage?

 senty15 июн. 2016 г., 18:40
Есть ли способ, которым я могу получить завершение трех? Как правильно это сделать? Я не понимаю, куда звонитьcollectionView.reload() если я сделаю их отдельно.
 Frank van Puffelen15 июн. 2016 г., 18:46
Похоже, вы надеетесь загрузить все файлы из папки за один раз. Это не поддерживается в Firebase Storage. Я также сомневаюсь, что это очень поможет, так как для большинства файлов размер файла намного превышает требуемый дополнительный туда-обратно.
 Shubhank15 июн. 2016 г., 18:36
от члена командыstackoverflow.com/questions/37694009/...

Ответы на вопрос(2)

хотите ли вы этого, но я нашел простой способ загрузки нескольких файлов в хранилище Firebase и получения соответствующих URL-адресов для загрузки.

  private void uploadPosts(final ArrayList<String> mediaUris) {

        StorageReference fileRef = storageRef.child("users").child(Objects.requireNonNull(mAuth.getCurrentUser()).getUid()).child("posts").child(key).child("file_" + index);
        File mediaFile = new File(mediaUris.get(index));


        final UploadTask uploadTask = fileRef.putFile(Uri.fromFile(mediaFile));
        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(final UploadTask.TaskSnapshot taskSnapshot) {
                fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {

                        Log.d(TAG,"URL = "+uri); //url of each file

                        if(index < mediaUris.size()) {
                            index++;
                            uploadPosts(mediaUris); //Recursion
                        }

                    }
                });
            }

        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(getApplicationContext(), "Upload failed", Toast.LENGTH_SHORT).show();
                Log.e(TAG,"Failed "+e.getCause());
            }

        });

    }
Решение Вопроса

Firebase Storage - я думаю, что здесь слишком много вопросов: будем ли мы архивировать файлы и хранить их таким образом, мы вернем упакованный пакет и т. Д. Мы просто вернемся? массив URL для загрузки или соответствующие данные?

Наше решение проблемы перечисления и загрузки нескольких файлов состоит в том, чтобы загружать их по отдельности и сохранять URL-адреса в другой базе данных (например, в базе данных Firebase Realtime), которую затем можно синхронизировать и использовать для загрузки каждого файла по отдельности (или для сохранения загружаемых файлов). и использовать такой инструмент, какSDWebImage загрузить или кэшировать соответствующие URL).

Увидетьhttps://gist.github.com/mcdonamp/cc45567cd95ba2a62017cb21e891effd а такжеhttps://www.youtube.com/watch?v=xAsvwy1-oxE&feature=youtu.be для примера того, как мы это сделали.

 CopsOnRoad01 апр. 2018 г., 18:01
Иногда URL возвращаетсяgetDownloadUrl() недопустимо, поэтому бесполезно использовать базу данных реального времени для этой цели. Когда вы пытаетесь возобновить загрузку с помощью uploadSessionUri, файл может возобновиться полностью, но URL возвращаетсяonSuccess() не является действительным. Тем не менее, файл вполне нормально в консоли, а URL - нет. Что делать в этом случае?
 Mike McDonald02 апр. 2018 г., 18:07
@CopsOnRoad URL должен быть всегда действительным (если вы не сделали его недействительным в консоли). Если у вас есть репродукция для нас, пожалуйста, сообщите в службу поддержки (firebase.google.com/support/contact/bugs-features) так что мы можем увидеть, если есть ошибка.
 CopsOnRoad02 апр. 2018 г., 18:21
Я ничего не делал из консоли, в моем logcat я виделonSuccess() позвонили и после этого я вошелgetDownloadUrl() оттуда. Когда я скопировал эту ссылку и вставил в браузер, она не работала. Однако, когда я делал те же шаги со свежей загрузкой файла, он возвращал рабочий URL. Итак, я думаю, что есть ошибка. Я собираюсь представить отчет по ссылке, которую вы написали. Надеюсь получить какое-то решение с вашей стороны.

Ваш ответ на вопрос