質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

233閲覧

firebase Storageに一気に複数の画像を保存したい。

atk_721

総合スコア62

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/09/25 12:53

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2020/09/26 05:01

最初に for が続けて出るのは、変数 imageLink に何も代入されていない(nilになっている)状態でfor ループに入り、その中でif の条件 imageLink != nil  が満たされない のでifブロックの中のコードで1,2,3が表示されること無く、次のループに入るからだと思われます。 もう一度、プログラムを丁寧に見直すことをお勧めします。また、imageLink と imageLinks のように紛らわしい名前の変数を使わないようにすることも、お勧めします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問