2012年9月13日木曜日

iPhone5

だいたいは予想通りだった。絶対買う。
1136x640かー。今つくってるやつはまあ問題なく動くと思うけどどんな感じになるんかな。
ノイズキャンセリングは意外だった。かなり嬉しい。PHITEK blackbox i12買うかーでもコネクタ変わるしどうしよーかなーとうじうじ決めかねてたら公式が出た。及び腰ストラテジー万歳。
auはテザリングか。どうしようかな。ソフトバンクも来ないかな。iProxyあるけど。

とりあえずケース買った。こんなん

ついでにコーエー定番シリーズ 大航海時代も一緒に買ったった。勢いって怖い。でも当時これMSX2版で10,000円近くしてたように思う。めっちゃハマったなー。22年前か。時代の流れは恐ろしい。

followees/followers

地道にPreferences作成中。
マルチアカウントは意外にあっさり組めたけど、followee/erの取得処理につまずいた。
こいつらもlimitが最大20やからOADataFetcher→ticket受取を繰り返すねんけど、その間にアカウントを切り替えると当然followee/erが変わるのでエラーが返ってくるから、アカウント切り替えたらticketの受取キャンセルしようと頑張ったけど、フラグの判定か思考能力に問題があるのかなぜか最後まで行こうとする。
なのでNSObjectのサブクラス作ってこいつらにfetcher回させてアカウント変わったらnilして新品交換することにしたらうまく動いた。オブジェクト指向万歳。
あとavatarはGDCで非同期に取るようにしてたけど、follower300件弱程度でも負荷がでかいみたいで、timeoutを頻発してたから、結局NSURLConnectionでresponseを受け取る慣れ親しんだ仕様に切り替えたらあっさり動いた。フィーリングデバッグだが気にしない。

などと文章にするといかにも片っ端からソリューションしてるように見えるが、これらで2日は悩んだ。まあ何事も勉強だ。解けない問題はない。

アカウント絡みの処理は完了したので、後は細々カラーテーマやら文字サイズやらcontentModeやらやって、timelineに入りたい。PrefはひとつのUITableViewControllerクラスを再帰的(というのか)にpushしてるので、管理はしやすいがdelegateの継承管理などで大変。でもobjective-cがなんとなく手に馴染んできた感はある。気のせいかも。

ま、一言で言うといい感じに仕上がってきたかな。どうやろー。

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でやったほうがいいのかどうかわからなくなってきた。ちょっと考える。