前提・実現したいこと
saveImageInStorageで画像をstorageに保存してから、次のfor文に移りたいのですが思った処理になりません。
なぜ最初に"for"だけがitemImagesの数だけ呼ばれいるのか、
最初の処理は意図した流れで呼べているのですが、二回目以降saveImageInStorageが二度呼ばれたりとなぜこうなってしまうのか、お分かりになる方教えて欲しいです。
発生している問題・エラーメッセージ
itemImagesに画像を5つ入れて,uploadImageを呼び出した際のログです。
##Logの表示
for 2020-09-25 21:36:53.663600+0900 Project[7822:2814719] Metal API Validation Enabled for for for for 11 22 33 1 2 3 uploadCount 1 iamgescount 5 5 6 11 22 11 22 33 1 2 3 uploadCount 2 iamgescount 5 5 6 33 1 2 3 uploadCount 3 iamgescount 5 5 6 11 22 11 22 33 1 2 3 uploadCount 4 iamgescount 5 5 6 33 1 2 3 uploadCount 5 iamgescount 5 4 imageUrls ["https://firebasestorage.googleapis.com/v0/b/project-e4352.appspot.com/o/ItemImages%2FFAB31525-F21C-413E-BA26-21D081AA9B44_0?alt=media&token=a9888a5f-dcf0-4881-b956-fa0745db3b6f", "https://firebasestorage.googleapis.com/v0/b/project-e4352.appspot.com/o/ItemImages%2FFAB31525-F21C-413E-BA26-21D081AA9B44_0?alt=media&token=7b0d2222-3f7b-4fc9-b533-55d3000563d1", "https://firebasestorage.googleapis.com/v0/b/project-e4352.appspot.com/o/ItemImages%2FFAB31525-F21C-413E-BA26-21D081AA9B44_0?alt=media&token=7b0d2222-3f7b-4fc9-b533-55d3000563d1", "https://firebasestorage.googleapis.com/v0/b/project-e4352.appspot.com/o/ItemImages%2FFAB31525-F21C-413E-BA26-21D081AA9B44_0?alt=media&token=967709d8-f09d-4da2-a299-64958620d62f", "https://firebasestorage.googleapis.com/v0/b/project-e4352.appspot.com/o/ItemImages%2FFAB31525-F21C-413E-BA26-21D081AA9B44_0?alt=media&token=967709d8-f09d-4da2-a299-64958620d62f"]
ImageLoader
class ImageLoader { static func uploadImages(pathType: filePathType,images: [UIImage?], uid: String, completion: @escaping(_ error:Error?, _ imageLinks: [String]) -> Void) { var imageLinks: [String] = [] if !Reachabilty.HasConnection(){ let error = CustomError.notConnection completion(error, imageLinks) } var uploadImagesCount:Int = 0 var nameSuffix:Int = 0 let fileName = pathType.rawValue + "/" + uid + "_(nameSuffix)" let uploadQueue = DispatchQueue.init(label: "uploadQueue") uploadQueue.sync { for image in images { print("for") let imageData = image!.jpegData(compressionQuality: 0.01) saveImageInFirestore(fileName: fileName, Data: imageData!) { (error, imageLink) in if imageLink != nil { print("1") imageLinks.append(imageLink!) print("2") uploadImagesCount += 1 nameSuffix += 1 print("3") print("uploadCount",uploadImagesCount) print("iamgescount",images.count) if uploadImagesCount == images.count { print("4") completion(nil,imageLinks) return } print("5") } print("6") } } } } static func saveImageInStorage(fileName: String,Data: Data, completion: @escaping(_ error: Error?,_ imageLinks: String?) -> Void) { let upload = DispatchQueue(label: "uploadQueue") upload.sync { var task: StorageUploadTask! let meta = StorageMetadata() let storageRef = Storage.storage().reference(withPath: fileName) meta.contentType = "image/jpg" task = storageRef.putData(Data, metadata: meta, completion: { (meta, error) in task.removeAllObservers() print("11") if let error = error { completion(error, nil) return } print("22") storageRef.downloadURL { (url, error) in if let error = error { completion(error,nil) return } print("33") guard let downLoadURL = url else { return } completion(nil, downLoadURL.absoluteString) } }) task.resume() } } }
##呼び出し元
@objc func handleSaveItem() { self.showloader(true) ImageLoader.uploadImages(pathType: .Item, images: self.itemImages, uid: itemData.id) { (error, imageUrls) in if let error = error { self.errorAlert(message: error.localizedDescription) return } print("imageUrls",imageUrls) self.showloader(false) } }
##変数
var itemData = Item(sellerId: "", price: 0, inStock: 0, itemName: "", images: [], description: "") private var itemImages: [UIImage?] = []
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
最初に for が続けて出るのは、変数 imageLink に何も代入されていない(nilになっている)状態でfor ループに入り、その中でif の条件 imageLink != nil が満たされない のでifブロックの中のコードで1,2,3が表示されること無く、次のループに入るからだと思われます。
もう一度、プログラムを丁寧に見直すことをお勧めします。また、imageLink と imageLinks のように紛らわしい名前の変数を使わないようにすることも、お勧めします。
あなたの回答
tips
プレビュー