2012年9月3日月曜日

アカウント、Photo、非同期

やっぱりOAuth前にログアウトしとくのが確実なような気がしたので最初hidden=YESでログアウト画面行って通常のログイン画面に戻った時点でhidden=NOにしてaccessTokenをrequestする形にした。

あと、設定画面で次の画面のtableをpushしたらdeallocatedと怒られた。調べるとnavigationcontrollerがnullになってる。interfaceで宣言しとかないとメモリ確保されないのか。なんか参考サイトではブロック内で宣言してるように見えるけど基本中の基本なんかな。まあdeallocatedの理由は自分の場合9割方こいつなので慌てふためくこともなくなってきた。

あとふと思い立って、Photoも現状は画像全体が画面にぴったりおさまるようにUIViewContentModeScaleAspectFitしてるけど、横幅いっぱいに広げて縦長の場合はスクロールするバージョンも用意して選択できるようサブクラスを作りなおした。完璧。

最後に非同期。avatarの画像を非同期で引っ張ってくるためにそれ用のUIImageViewのサブクラス作ろうとしたけどちょっと調べたらGCDであっさり並列処理できるみたいでちょっとやってみた。dispatch_queue_tというオブジェクトを生成してブロックで並列させたい処理をdispatch_asyncに入れるだけで簡単に動くみたい。

でもretinaだと画像が汚くて、大きめの画像を引っ張ってきてsetFrameしてもcellのimageViewに入れるとframeが効いてない。stackoverflowで探しても、UITableViewCellのlayoutSubviewsをオーバーライドしないといけないみたいで、めんどくさーと思いながらいろいろ探すとUIGraphicsBeginImageContextWithOptionsを見つけた。こいつの最後の引数(scale)に[[UIScreen mainScreen]scale]=通常1/retinaなら2を渡すとそれぞのディスプレイ解像度に応じた画像になるみたい。やってみた。

Preferences.m(抜粋)
if(item==@"Accounts"){
 cell.detailTextLabel.text=[[self.delegate getUserNames]objectAtIndex:0];
 if(!avatar){
  UIGraphicsBeginImageContext(CGSizeMake(32,32));
  [[UIImage imageNamed:@"img_white"] drawInRect:CGRectMake(0,0,32,32)];
  UIImage *white=UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  cell.imageView.image=white;
  NSString *url=[NSString stringWithFormat:@"http://api.tumblr.com/v2/blog/%@.tumblr.com/avatar/64",[[self.delegate getUserNames]objectAtIndex:0]];
  dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
  dispatch_async(queue,^{
   UIGraphicsBeginImageContextWithOptions(CGSizeMake(32,32),YES,[[UIScreen mainScreen]scale]);
   [[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url]]]drawInRect:CGRectMake(0,0,32,32)];
   avatar=UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();
   cell.imageView.image=avatar;
   [cell layoutSubviews];
  });   
 }else{
  cell.imageView.image=avatar;[cell layoutSubviews];
 }
 cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
}

できた。あとは設定項目を潰していって、timelineモードの検討。これはtableでやったほうがいいのかどうかわからなくなってきた。ちょっと考える。

0 件のコメント:

コメントを投稿