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のダウンロード非同期にしないと結局遅い。それやろう!!