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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2200閲覧

画像をセルに非同期で読み込みたい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/03/04 13:07

UITableViewCellに画像を非同期で読み込みたいのですが、下のコードを実行すると、セルをタップした時にセルを再利用する前の画像から新しい画像に切り替わる、という結果になってしまいます。

どうすれば、セルをタップしなくても新しい画像に切り替わりますか?
よろしくお願いします。

Swift

1let url = "http://example.com" 2let config = NSURLSessionConfiguration.defaultSessionConfiguration() 3let session = NSURLSession(configuration: config) 4let req = NSURLRequest(URL: url) 5let task = session.dataTaskWithRequest(req, completionHandler: { 6 (data, resp, err) in 7 let imageData = UIImage(data: data!) 8 cell.iconImage?.image = imageData 9}) 10task.resume()

コンソールに出てきた内容です↓

This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release. Stack:( 0 CoreFoundation 0x00000001816ad918 <redacted> + 148 1 libobjc.A.dylib 0x0000000180d1bf80 objc_exception_throw + 56 2 CoreFoundation 0x00000001816ad848 <redacted> + 0 3 Foundation 0x000000018214b2d4 <redacted> + 88 4 Foundation 0x0000000181fd199c <redacted> + 56 5 Foundation 0x0000000181fcd55c <redacted> + 260 6 UIKit 0x00000001864a75e0 <redacted> + 64 7 UIKit 0x00000001864a80f8 <redacted> + 244 8 UIKit 0x00000001869db9d0 <redacted> + 200 9 UIKit 0x0000000186c118b4 <redacted> + 268 10 UIKit 0x00000001866aefac <redacted> + 176 11 UIKit 0x000000018639b778 <redacted> + 656 12 QuartzCore 0x0000000183daab2c <redacted> + 148 13 QuartzCore 0x0000000183da5738 <redacted> + 292 14 QuartzCore 0x0000000183da55f8 <redacted> + 32 15 QuartzCore 0x0000000183da4c94 <redacted> + 252 16 QuartzCore 0x0000000183da49dc <redacted> + 512 17 QuartzCore 0x0000000183dd3ae0 <redacted> + 236 18 libsystem_pthread.dylib 0x00000001813161e0 <redacted> + 584 19 libsystem_pthread.dylib 0x0000000181315d58 <redacted> + 136 20 libsystem_pthread.dylib 0x000000018131553c pthread_mutex_lock + 0 21 libsystem_pthread.dylib 0x0000000181315020 start_wqthread + 4 )

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

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

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

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

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

guest

回答1

0

ベストアンサー

セルをタップせずに更新するためには、UITableViewを利用しているとするならば、reloadメソッドを呼び出して上げる必要があります。
非同期でダウンロードしている画像がダウンロードし終わったら、上記を呼び出すという流れでしょうか。
ちなみに、UIに関する操作をUIスレッドとは別のスレッドで呼び出すとおかしな事になる場合が多いので、その辺りも考慮して呼び出すと良いかと思います。

投稿2016/03/05 03:33

t_obara

総合スコア5488

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

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

退会済みユーザー

退会済みユーザー

2016/03/05 04:19

reloadメソッドというのはUITableViewのreloadDataメソッドのことでしょうか?
t_obara

2016/03/05 05:26

間違えました、その通り、reloadDataです。
退会済みユーザー

退会済みユーザー

2016/03/05 07:16

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell let url = "http://example.com" let config = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: config) let req = NSURLRequest(URL: url) let task = session.dataTaskWithRequest(req, completionHandler: { (data, resp, err) in let imageData = UIImage(data: data!) cell.iconImage?.image = imageData self.tableview.reloadData() }) task.resume() } このようにしたら、常にTableViewが更新されてしまい、点滅するような感じになった上、画像も更新されませんでした。 reloadDataメッソッドを実行するタイミングが悪かったのでしょうか?
t_obara

2016/03/08 09:21

ダウンロードが完了したタイミングでreloadDataを呼び出すのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問