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

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

新規登録して質問してみよう
ただいま回答率
85.35%
非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Swift

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

Q&A

0回答

1206閲覧

swiftでの非同期処理完了までの待機の仕方

testplayer

総合スコア18

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Swift

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

0グッド

0クリップ

投稿2021/05/22 16:00

SwiftでライブラリKingfisherを利用してURLの画像を取得してリストとして表示しようとしているのですが
Kingfisherは非同期で取得するようでボタンを一回押すだけでは表示できないようです

DispatchSemaphoreを使えば待機していくれるということはわかったのですが
下記のコードを実行するとフリーズしていまいます

swift

1 let semaphore = DispatchSemaphore(value: 0) 2 var uiImage : [UIImage] = [] 3 4 for(_ ,value) in self.ImageUrlList 5 { 6 KingfisherManager.shared.retrieveImage(with: URL(string: value)!){ result in 7 switch result { 8 case .success(let value): 9 uiImage.append(value.image) 10 semaphore.signal() 11 case .failure(let error): 12 print(error) 13 } 14 } 15 16 semaphore.wait() 17 18 }

ImageUrlListはDictionary型で画像のURLが入っています

このコードのどこが問題なのでしょうか

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

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

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

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

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

hoshi-takanori

2021/05/22 19:18 編集

Kingfisher の completionHandler はデフォルトではメインスレッドで処理されるので、semaphore.wait を先に呼ぶと semaphore.signal が呼ばれずにデッドロックするのでしょう。 https://kingfisher.onevcat.com/kingfishermanager/ 非同期処理を待機するのは基本的に良くなくて、いったん制御を OS に戻して、結果が戻ってきた時に改めて処理を行うようにするのが良いと思います。
tomato879241

2021/05/23 03:03 編集

そもそもどのクラスの下でそのコードを書いているかわからないんですけど?
testplayer

2021/05/23 03:45

>hoshi-takanoriさん そうなんですかそちらの方向で修正したいと思います コードが書いてあるプロジェクトはある程度進んでおり待機中の操作を制御するフラグを追加するのが大変そうなので待機を追加できればなと思ってのものでよい方法があったら教えていただきたいです >tomato879241さん メインのViewControllerです
hoshi-takanori

2021/05/23 03:50

待機するということはその間メインスレッドを止めてアプリが固まったように見えるということなので、お勧めはできません。 ちなみに、uiImage の配列はどう使うのでしょうか?
testplayer

2021/05/23 04:00

配列に関してはcollectionViewで表示するのと ファイルで保存するために取得しております。(保存→保存した画像を表示という感じです) 強制待機は良くないとわかったので処理後に表示する機能を追加したいと思います ありがとうございます
hoshi-takanori

2021/05/23 04:53

保存に関しては、Kingfisher はもともとダウンロードした画像をキャッシュする機能を持ってると思いますが、それとは別に保存したいということでしょうか? また、表示に関しては、とりあえず仮の画像 (placeholder) を表示しておいて、目的の画像がダウンロードされたら自動的に表示するような機能も、たぶん Kingfisher が持ってるのでは…。
testplayer

2021/05/24 10:26

すいません 正直Kingfisherの機能についてはまだ把握してない部分が多くよくわかってません placeholderなどを調べて見たいと思います ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問