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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

4729閲覧

swiftでcell内の非同期処理が完了してから表示させたい

_CHO

総合スコア16

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

1クリップ

投稿2018/01/06 09:45

TableViewやCollectionViewのCellに、サーバーから非同期処理でダウンロードして画像を表示させる複数のImageViewを配置している時に、全ての非同期処理(画像ダウンロード)が終わるまでは画像を表示させず、処理が終わったら同時に全ての画像を表示させることを実現したいです。

どのようにするのが良いでしょうか?
画像のダウンロードは、現状は、Alamofire Imageを使っていますが、他のものを使ったやり方でも構いません。
アドバイスお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

自分がよくやる方法は

対象のUIViewControllerにdataSource変数をもたせて(名前とかは何でもいいですが)
それに対して、非同期処理が終わったタイミングで返ってきた値をdataSourceに入れて、reloadDataを走らせるやり方です。

参考になれば幸いです

※dataSourceに入る値が厳密には何かわからなかったので、おっしゃっていた画像の配列をもたせています。

class TableViewController: UIViewController { var dataSource: [UIImage]? func viewDidLoad() { getData() } func getData() { //コールバックで値が返ってきたときに、dataSourceないに値を入れて、tableView.reloadDataを走らせる } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //dataSourceに値が入ってない場合は、0を返す。getDataでコールバックご再度tableViewのreloadデータを走らせて、dataSourceに値が入って入れば、そのぶんtableViewに値が表示される return dataSource != nil ? (dataSource.count)! : 0 } }

投稿2018/01/07 02:16

komo_ta

総合スコア275

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

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

_CHO

2018/01/07 13:08

回答ありがとうございます???? 例えば、取得する画像データが3つあったとしたら、どのようにして全てのデータのダウンロードが完了したかを判定するのがいいでしょうか? フラグを持たせて、全てのフラグが立つのをチェックするようなやり方でしょうか?
komo_ta

2018/01/07 13:54

それもなくはないですが、基本的にはurlをコールバックでもらうのがいいかなと思います。それをSDWebImageで非同期でダウンロードするのがいいかなと思います〜 //urlをstringの配列で受け取る dataSource: [String]? //cellForメソッド内で、以下のメソッドを実行 let encodeStr = dataSource[indexPath.row].addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) cell.imageView.sd_setImage(with: URL(string: encodeStr!), placeholderImage: UIImage(named: "no_image")) 多分AlamofireImageでもできると思うんですが、SDWebimageを使い慣れているので。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問