UITableViewCellで画像を非同期でロードしようとしたときに困った事②
今回は少し自分のまとめをするためにも書きます。(今日はですます口調の気分)
以前GCDを用いた非同期について書きましたが、やめました。
簡単に別スレッドを作れてとても楽だったんですが、自分が非同期するのって今の所URLから何かダウンロードする時くらいだったので、複雑にするよりも少しシンプルに行きたいと思います。以前も書いたんですが、UITableViewCellでのNSURLConnectionを使った非同期についてです。
あの後少し意見を貰い(やっぱり書くっていいですね、たまに誰かから意見頂ける)、NSMutableDictionaryでindexPathをキーにして色々保存することがUITableViewCellを制覇するコツでした。ただ、やっぱり再利用の問題は解決出来ませんでした。
例えば、各セクションの0行目のセルにだけ画像をつけたい場合
if([picFriendsPhotos_ objectForKey:indexPath]) {
cell.textLabel.text =@"";
cell.imageView.image = [picFriendsPhotos_ objectForKey:indexPath];
return cell;
}
見たいに書きます。しかし、imageは特定のセルにしか貼付けてないはずが、他の行目のセルに見えたりしてしまいます…。苦肉の策として、それ以外のセルにはnullを貼付けることでどうにか防いでます。(今の所不便は無い…今の所…)
NSURLConnectionを使った非同期については、
① NSURLRequest *req = [NSURLRequest
requestWithURL:[NSURL URLWithString:src]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];
NSLog(@"%@",src);
conn_ = [[NSURLConnectionalloc] initWithRequest:req delegate:self]; //非同期開始
if(conn_) {
receiveData_ = [[NSMutableDataalloc]initWithCapacity:0];
② NSString *str = [NSString stringWithFormat:@"%d%", conn_];;
③ [conInfo_ setValue:indexPath forKey:str];
④ [conType_ setValue:@"photo" forKey:str];
NSLog(@"yescomeon getimage");
maxCountPhoto++;
}
①でとその下らへんで非同期を開始します。
そして、自分的にはこれが一番いいと思ってるんですが、②でcoonectionをNSStringにしてしまい、③でindexPathを登録、④で今回ダウンロードする種類を指定するのがいいんではないかと思います。ここらへんは他の人のあんまり参考にしなかったんで、良いのか悪いのかわかりません!誰か教えて頂けると喜んじゃいます。
後は- (void)connectionDidFinishLoading:(NSURLConnection *)connectionメソッド内で
if ([[conType_ objectForKey:str] isEqual:@"icon"]) {
UIImage *me = [UIImage imageWithData:receiveData_];
[picFriendsOwnerPhoto_setValue:me forKey:[conInfo_objectForKey:str]];
NSLog(@"type icon");
[self.tableView reloadData];
}
elseif ([[conType_objectForKey:str] isEqual:@"photo")・・・・
connectinoのタイプ分け、そしてconnectionについてるindexPathをキーにしてデータの紐付けを行なえばバッチグーだと思います。
tableViewのreloadDataメソッドを呼べば勝手に更新されてきます。
indexPathについては前々回の記事より
①NSUInteger newIndex[] = {0, 1}; // 0番目のセクションの2行目
②NSIndexPath *newPath = [[NSIndexPath alloc] initWithIndexes:newIndex length:2];
とかけば、指定出来ます。後々後、これは自分の勝手な考えなんですが(そんな事言ったら全部そうだけど)、-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッド内では、基本URLConnectionやら他の無駄な処理はあんまりさせない方がいいと感じました。だって、わかりづらいし、ごちゃごちゃしてる。割り切って、tableの中身を表示するだけ。でなるべく考えた方がいいと思います。そして、なんで文字が大きくならないんだー!!!はてブロー!俺が悪いのかー!