GCDを用いた非同期

そのうちGitにあげます!上げれるほど奇麗じゃないからも・・もう少し…!

 

以前の記事でUITableViewCellで画像を非同期ロードしようとした際に奇麗に表示出来なかった。

そもそもindexPathというものを理解していなくて、indexPathはsectionとcellで出来てるらしい。

①NSUInteger newIndex[] = {0, 1}; // 0番目のセクションの2行目  

②NSIndexPath *newPath = [[NSIndexPath alloc] initWithIndexes:newIndex length:2]; 

こんな風に書く事で①でセクションの番号(indexPath.section)、cellの行数(indexPath.row)からindexPathを作り出す配列を作り、②でNSIndexPathを作る。lengthについては①の配列が2つのため2(つまり毎回2?)。

そしてNSMutableDictionaryにnewPathをkeyにしてUIImageとか画像のURLを紐づけておけばいい。

こんな感じ [self.picFriendsPhotossetObject:picforKey:newPath];

 

本題に入るけど、GCDを使った非同期。

まずはパクリが大切なんで…

9割9分9厘くらいこの方のを参考にしました。僕の見る必要ないです(ぁ。

http://d.hatena.ne.jp/yuum3/20101216/1292490323

ただ、このやり方だとfqlを叩いたあとに返り値が来る前に

    dispatch_async(timeline_queue, ^{

        [selfgetPublicTimeline];

        dispatch_async(main_queue, ^{

            [self.tableView reloadData];

        });

    });

ここのgetPublicTimeLineの処理が終わってしまう。

そこで、まずgetPublicTimeLineメソッド内で無限ループを作っておく。

    while(!flag) {}

そして、fqlを叩くと

- (void)request:(FBRequest *)request didLoad:(id)result;データが返ってくるんだけど

そのメソッド内で flag = YES; とやって!!!

そしたらgetPublic内でfalg=YESの場合の処理をすればいい!!

このやり方はクールじゃないから、早く違う方法見つける予定…。

 

cell内の画像の表示については

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッド内で

    if([picFriendsPhotos_ objectForKey:indexPath]) {

①        cell.imageView.image = [picFriendsPhotos_ objectForKey:indexPath];

         cell.textLabel.text = nil;

    }

②     cell.imageView.image = [picFriendsPhotos_ objectForKey:indexPath];

とやればとりあえず出来る。しかし問題解決出来てない、出来てない!

 

セルは1セクションに対して2つしかない。

①で1行目に画像を設置(これは大丈夫)

②でも設置…この②を書かないと2行目のセルにたまに1行目の画像が表示されてしまう!(セルの再利用問題?!)

あれ…書いてて気づいたけど①いりません。やった!今日唯一の成果だ!

うーん、URLのダウンロード非同期にしないと結局遅い。それやろう!!