for循环不考虑所有项目?

For loop not accounting for all items?

我有一个多 selection 图像选择器,目的是允许用户 select 多个资产,然后将每个资产上传到数据库。在完成处理程序中,我获取所有 selected 资产并将它们传递给自定义函数:uploadImageAssets(assets: [PHAsset], projectRef: DocumentReference),上传开始的地方。

在该函数中,我使用 for 循环分别上传每个资产。在正确上传资产的同时,并非所有资产都在上传。假设我已经 select 编辑了 5 个资产...只有 4 个会出现在数据库中,而且它们都是相同的图像,重复。知道为什么会这样吗?下面是我的代码:

图像选择器选择:

@IBAction func uploadProjectTapped(_ sender: Any) {
    
    let imagePicker = ImagePickerController()
    imagePicker.settings.selection.max = 10
    imagePicker.settings.theme.selectionStyle = .numbered
    imagePicker.settings.fetch.assets.supportedMediaTypes = [.image, .video]
    imagePicker.settings.selection.unselectOnReachingMax = false

    let start = Date()
    self.presentImagePicker(imagePicker, select: { (asset) in
        print("Selected: \(asset)")
    }, deselect: { (asset) in
        print("Deselected: \(asset)")
    }, cancel: { (assets) in
        print("Canceled with selections: \(assets)")
    }, finish: { (assets) in
        print("Finished with selections: \(assets)")
        self.getAssetThumbnail(assets: assets)
    }, completion: {
        let finish = Date()
        print(finish.timeIntervalSince(start))
    })
    
}

以及将它们添加到 Firestore 的函数:

func uploadImageAsset(assets: [PHAsset], projectRef: DocumentReference) {
    let userID = Auth.auth().currentUser?.uid
    let db = Firestore.firestore()
    let manager = PHImageManager.default()
    let option = PHImageRequestOptions()
    option.isSynchronous = false
    option.isNetworkAccessAllowed = true
    option.resizeMode = .exact
    option.version = .original
    option.deliveryMode = .highQualityFormat
    let uniqueImageID = NSUUID().uuidString
    let storageRef = Storage.storage().reference().child("project-images").child("\(uniqueImageID).jpeg")
    
    for asset in assets {
        let imageSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
        
        manager.requestImage(for: asset, targetSize: imageSize, contentMode: .aspectFill, options: option) { (image, info) in
            let uploadData = image?.jpegData(compressionQuality: 0.6)
            storageRef.putData(uploadData!, metadata: nil, completion: {
                (metadata, error) in

                if error != nil {
                    return
                } else {
                    storageRef.getMetadata(completion: { (metadata, err) in
                        if let error = err {
                            print(error)
                        } else {
                            storageRef.downloadURL(completion: { (url, err) in
                                if let error = err {
                                    print(error)
                                } else {
                                    self.imageAssetURLs.append((url?.absoluteString)!)
                                    guard let url = url?.absoluteString else { return }
                                    
                                    
                                    projectRef.updateData(["images": FieldValue.arrayUnion([url])], completion: { (err) in
                                        if err != nil {
                                            print(err)
                                        } else {
                                            self.dismiss(animated: true, completion: nil)
                                        }
                                    })
                                    
                                    
                                }
                            })
                        }
                    })
                }
            })
            
        }
        
    }
}

我强烈感觉错误出在这一行:

self.imageAssetURLs.append((url?.absoluteString)!)
                                guard let url = url?.absoluteString else { return }

func uploadImageAsset(...)

let uniqueImageID = NSUUID().uuidString

let storageRef = Storage.storage().reference().child("project-images").child("\(uniqueImageID).jpeg")

应该在

之前的循环内
storageRef.putData(..)