UITableViewCellで画像を非同期でロードしようとしたときに困った事
/* 追記
出来るらしいです。試ししたらまた書きます!
*/
毎日書くぞと意気込んで、3日目にして時間オーバーした!笑
社会人で毎日ブログ書いてる方がいたらすごいと思う…。帰ってからじゃ0時過ぎちゃうからお昼とか、休憩の合間合間に書くのがいいんかなぁ。ちょっとそこらへんブロガーに聞きたい!
今日は既にあきらめた(ぁUITableViewCellへの非同期の画像のロードについて。非同期で画像をロードするにはNSURLConnectionがとっても簡単と誰かの記事に書いてあったので挑戦してみた。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:メソッド内で
cell.imageView.image = [UIImagealloc]initWithData:data]; で画像がつけれる。
しかし、画像をURLから落とす場合は同期だととても重くなってしまうため非同期で行なう方が良い。
NSURLRequest *req = [NSURLRequest
requestWithURL:[NSURL URLWithString:_images]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];
_conn = [[NSURLConnectionalloc] initWithRequest:req delegate:self]; //非同期開始
こんな風にするだけであとは
//レスポンスを受け取ったら?
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
//受信中
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
//受信終わり
- (void)connectionDidFinishLoading:(NSURLConnection *)connection; //受信終わり
に値がダウンロードされていく。試してはいないけど、たくさんのスレッドがが始まってもレスポンスを受け取る〜受信完了までは1個1個みたい…?!
ここまでは色々な記事にもっと詳しく書いてあるからそちらをみたほうがいいでしょう。
では何が困ったのかというと、画像のダウンロードとCellに表示される順番がずれてしまうということ!
先に解決方法を書いておくと、ドラッグが止まった時にダウンロードを開始すればいい…らしい。
いやいや、ドラッグしてるときだってダウンロードしたいやん!!って思って何が何でもと挑戦した2日間。
ダウンロードが完了と同時に、
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
UITableViewCell* c = [self.tableView cellForRowAtIndexPath:indexPath];
c.imageView.image = [[UIImage alloc]initWithData:data];
[c setNeedsLayout];
でダウンロードが終わったコネクションとindexPath.rowを紐づけておけば直接indexPath.rowにダウンロード出来る…と妄想しました。
一応こんな感じ
NSString *str = [NSString stringWithFormat:@"%d%", _conn];
NSString *str2 = [NSString stringWithFormat:@"%d",index.row];
[_imageIndex setValue:str2 forKey:str];
結局できませんでした。
メモリが勿体ないってことで表示している部分以外のセルは適当っぽいらしい。再利用とかなんとか。
再利用を阻止すればチャンス合ったり…?!
フィード見たいの作りたいと思ったらセクションを1つ1つ作成して非同期すれば大丈夫みたい…。
とまたやってもいない妄想。そのうちフィードの方に挑戦します。