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 allocinitWithIndexes:newIndex length:2]; 

とかけば、指定出来ます。後々後、これは自分の勝手な考えなんですが(そんな事言ったら全部そうだけど)、-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッド内では、基本URLConnectionやら他の無駄な処理はあんまりさせない方がいいと感じました。だって、わかりづらいし、ごちゃごちゃしてる。割り切って、tableの中身を表示するだけ。でなるべく考えた方がいいと思います。そして、なんで文字が大きくならないんだー!!!はてブロー!俺が悪いのかー!