Swift 从Firebase存储中检索节点下的多张照片

Swift 从Firebase存储中检索节点下的多张照片,swift,firebase,firebase-storage,Swift,Firebase,Firebase Storage,我有一个CollectionView,我正在使用Firebase存储中的图像来填充它。我将图像存储在“userId”节点下。我想检查节点下可用的文件是否存在,以便将它们存储在数组中 我试图为每个URL分别检索URL,但是,我认为这是一种非常错误的方法。但是,我不知道如何以最有效的方式进行,以及将collectionView.reload()放在哪里。这就是我所做的: let storage = FIRStorage.storage() let firstImageRef = storage.re

我有一个CollectionView,我正在使用Firebase存储中的图像来填充它。我将图像存储在“userId”节点下。我想检查节点下可用的文件是否存在,以便将它们存储在数组中

我试图为每个URL分别检索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存储中批量检索图像?

目前没有批量或分批上传/下载Firebase存储——我认为这里有太多的问题:我们是否将文件压缩并以这种方式存储,我们是否返回压缩包,等等。我们是否只返回一组下载URL,或适当的数据

对于列出和下载多个文件的问题,我们的解决方案是单独上载这些文件,并将URL存储在另一个数据库(例如Firebase Realtime数据库)中,然后您可以同步并使用该数据库单独下载每个文件(或者存储下载文件,并使用
SDWebImage
等工具下载或缓存相应的URL)


查看我们是如何做到这一点的示例。

目前没有批量或分批上传/下载Firebase存储——我认为这里有太多的问题:我们是否将文件压缩并以这种方式存储,我们是否返回压缩包,等等。我们是否只返回一组下载URL或适当的数据

对于列出和下载多个文件的问题,我们的解决方案是单独上载这些文件,并将URL存储在另一个数据库(例如Firebase Realtime数据库)中,然后您可以同步并使用该数据库单独下载每个文件(或者存储下载文件,并使用
SDWebImage
等工具下载或缓存相应的URL)


请参阅我们如何做到这一点的示例。

我不知道这是否是您想要的,但我找到了一种将多个文件上载到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());
            }

        });

    }
private void uploadPosts(最终ArrayList MediaURI){
StorageReference fileRef=storageRef.child(“用户”).child(Objects.requireNonNull(mAuth.getCurrentUser()).getUid()).child(“posts”).child(key.child(“文件”+索引);
File mediaFile=新文件(mediaUris.get(index));
final UploadTask UploadTask=fileRef.putFile(Uri.fromFile(mediaFile));
uploadTask.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(最终上载Task.TaskSnapshot TaskSnapshot){
fileRef.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
Log.d(标记,“URL=”+uri);//每个文件的URL
if(索引
我不知道这是否是您想要的,但我找到了一种将多个文件上载到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());
            }

        });

    }
private void uploadPosts(最终ArrayList MediaURI){
StorageReference fileRef=storageRef.child(“用户”).child(Objects.requireNonNull(mAuth.getCurrentUser()).getUid()).child(“posts”).child(key.child(“文件”+索引);
File mediaFile=新文件(mediaUris.get(index));
final UploadTask UploadTask=fileRef.putFile(Uri.fromFile(mediaFile));
uploadTask.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(最终上载Task.TaskSnapshot TaskSnapshot){
fileRef.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
Log.d(标记,“URL=”+uri);//每个文件的URL
if(索引
团队成员是否有办法完成这三项任务?正确的方法是什么?我不知道在哪里调用
collectionView.reload()
如果我单独执行这些操作。听起来你希望一次性加载文件夹中的所有文件。在Firebase存储中,这不是一个受支持的操作。我也怀疑这会有多大帮助,因为对于大多数文件,文件的大小远远超过所需的额外往返行程。从团队成员那里,我有办法完成thr吗ee?正确的方法是什么?如果我单独调用
collectionView.reload()
,我不知道应该在哪里调用它们。听起来你希望一次从一个文件夹加载所有文件。Firebase存储中不支持这种操作。我也怀疑它会有多大帮助,因为