UITableViewCellの再利用と非同期処理の話。
とりあえず「エキスパートObjective-Cプログラミング」読んだらいいんじゃないかな http://t.co/XcnhS1dsu9 Grand Central Dispatch, Grand Central Dispatch
2013-12-11 10:31:01よくある「tableViewCellの画像は非同期で」ってあるけど、普通にdispatch_asyncとかでやったらコールバックする前にセルが再利用されたらおかしくならない?それが怖くて手を出せないんやけど。 http://t.co/0nzxfIg70M
2013-12-11 09:28:50昔のコードではNSOperationかなんか使って、セルが再利用されるタイミングを見て非同期処理を止めてたよな。GDCでもその辺りの細かい制御をやる必要があると思うけど、それをやってるコードを見たことが無い。大丈夫なの?
2013-12-11 09:29:08@sumihiro cellの中でやるんじゃなくて、cellの外側でロードして、ロードが終ったらcellにセット(見えている場合のみ)とかですかね
2013-12-11 09:34:20@nakiwo 外部でやっても、外部でやってるのをキャンセルしないとリクエストキューがどんどん溜まって行きますよね?そこはいいのかなーとか。
2013-12-11 09:35:44@TeamMOSA2 そうなんですよ。そこまでやってるコードを最近見ないなーと。GDCは外部からキャンセル呼べないし、キャンセルさせるのが面倒なのかなーと。
2013-12-11 09:37:21@sumihiro NSOperationを使えってずっとゆってるのにみんな聞く耳もたないからおかしな動きしてるとざまぁって思ってる。
2013-12-11 09:48:42iOS 6以後ならtableView:didEndDisplayingCell:forRowAtIndexPath: というキャンセルに都合の良いメソッドが
2013-12-11 09:38:17再利用されるタイミングでキャンセルしようとしても、非同期で動いてるスレッド自体を外部から止めることができないので、キャンセルフラグとか立てて非同期スレッドの中でそれを参照して止まってくれるのを待つしか無いよなー。
2013-12-11 09:40:06再利用されるタイミングでキャンセルしようとしても、非同期で動いてるスレッド自体を外部から止めることができないので、キャンセルフラグとか立てて非同期スレッドの中でそれを参照して止まってくれるのを待つしか無いよなー。
2013-12-11 09:40:06で、非同期スレッドが止まる前に再利用された新しいセルとして別の非同期スレッドが走り出すとなると停止フラグはオフにしておかないとまずい。前のスレッドが止まったことを確認して新しいスレッドを走らせるとか、特定のスレッドに対して停止信号を出すとか、相当気を遣う必要があると思うが。
2013-12-11 09:41:59「画像をリサイズする」とかならセルが再利用されるまでの現実的な時間内に終わるかもしれんけど、「WEBからダウンロードする」とかなら確実に重複する可能性があるよな。
2013-12-11 09:43:05(Webからダウンロードなら、cellごとにrequest発行して、再利用されたときにまだrequestが完了してなければキャンセル、とかしてた)
2013-12-11 09:46:47