Hatena::Groupiphone-dev

iOS プログラミングメモ

2012-04-21 (Sat)

UIAlertView の Blocks 対応 14:24  UIAlertView の Blocks 対応 - iOS プログラミングメモ を含むブックマーク

さきほどツイッターで以下の一連の発言を見つけまして、発端は mixi engineer blog なんですが…。

Associated Object ってなんだろなー、やっぱ最前線の開発者はいろんなこと知ってるなぱねぇなとか思いながら、BlocksKit のソースコードを眺めていたのですが、結構入り組んでてわけわかんねーなオレへぼすぎワロタとか感じたので自分で考えることにしまして、もしかしたら UIAlertView のインスタンスに objc_setAssociatedObject でブロックなオブジェクトを代入すれば delegate で受け取れてまぁうまい事になりそうだからそういう事なのかなとかいう結論に落ち着いたところ、こんな感じのソースを発見しました。

UIAlertView, UIActionSheet に表示されるボタン類を、Blocks のコードをプロパティで保持した RIButtonItem クラスのインスタンスにすることで、ボタンとコールバックをうまく関連付けて実行できるように実装したものみたいですね。シンプルだし使い勝手が良さそう。ライセンスはMITライセンスかな。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20120421

2012-04-17 (Tue)

UILabel に入れるテキストを、範囲内に収まるように自動的に縮小する 13:23  UILabel に入れるテキストを、範囲内に収まるように自動的に縮小する - iOS プログラミングメモ を含むブックマーク

なんかどっかで誰かが困ってるのを見かけたので、書いておく。ググれば同様のいっぱいあると思うけどね。i単語帳 で使ってる奴。UILabelのカテゴリにしてある。

1行だったら adjustsFontSizeToFitWidth=YES すれば済むんだけど、複数行だと効かないのでこういうことしないといけない。

改めて見返してみて、self.font を使わないで引数で UIFont 取ってるのはなんでだろって思ったけど、self.font は上書きされちゃうから二回目以降困るんだね。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20120417

2012-04-12 (Thu)

i単語帳リリース 00:49  i単語帳リリース - iOS プログラミングメモ を含むブックマーク

というわけで取り急ぎ、i単語帳リリースしました。

落ち着いたら宣伝したとことかについて書いておきます。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20120412

2012-04-04 (Wed)

新作アプリをサブミットした 11:44  新作アプリをサブミットした - iOS プログラミングメモ を含むブックマーク

f:id:ktakayama:20120404104603p:image

そういえばここに書いてなかったけど、今年のはじめに「癒しネコ画像」「癒しイヌ画像」という犬猫好き垂涎のアプリをリリースしたんだった。というわけで、それ以来になる新しいアプリを昨夜サブミットしました。新作がリリースされるまでの間はキンチョーするね。

癒しアプリの時からCoreDataに手を出し始めたんだけど、今回の新作でもガッツリ使いました。CoreData超便利。いまさらCoreDataかよプギャーって言われるかもしれないけど、どんな点に感動したのか書き記しておきます。

マイグレーションが便利

あとからテーブル構成が変わるということ…特に開発段階だとああしてこうしてってことは往々にしてあることだけど、バージョン付けて管理できるので、はじめにあまりキッチリ決めなくても気軽に使い始められるのが楽でいいです。自前で SQLite 管理してると、このへん相当面倒なんだよね。

NSFetchedResultsController が便利

UITableViewController と NSFetchedResultsController の組み合わせで、データ一覧みたいなものが超簡単につくれます。データの更新や並び替えなんかも、リファレンスマニュアルのテンプレートを使えば、他の場所(例えば編集画面とか)で編集した内容がリアルタイムに反映されるんで、通知がどうだとか意識する必要がなくなります。

このテンプレだと、UISearchDisplayController を使ってる場合に、検索結果一覧の内容が変わんないから、その辺は適宜書き換えが必要です。ぼくはこんな風にしてる。

UITableView *tableView = self.searchDisplayController.isActive ?  self.searchDisplayController.searchResultsTableView : self.tableView;

他にも sectionNameKeyPath でセクション分けができる点もなにげに便利です。

fetchBatchSize が便利

テーブルに数万件とかデータが入ってると、そのデータを全部表示する(必要があるかどうかは別として)場合、一度に全部読み込むとメモリ消費量も多くなりますし動作も遅くなります。NSFetchRequest を生成する際に、fetchBatchSize を指定しておくと、必要な時に必要な件数ごとにデータを取得してくれるので、結構な高速化が期待できます。

ただしこの「必要な時」というやつが厄介で、例えば以下のように「別の NSArray を作っちゃえ」とかやってしまうと、そのタイミングで全件のデータを取得しにいって、しかも fetchBatchSize ごとに分割してリクエストするから、逆にとても遅くなります。SQLデバッグ機能を使って、発行されるSQLステートメントを良く確認しながらプログラムしないといけないです。

NSArray *result = [...executeFetchRequest:request error:&error];
NSArray *otherData = [NSArray arrayWithArray:result];

スレッドセーフじゃない点に注意

NSManagedObjectContext を使いまわしてると、データの更新タイミングとかですぐクラッシュするんで NSManagedObjectContext はスレッド毎に作るのがいいです。コードは、ここが参考になります。自分で作った便利クラスも機会があれば github とかに置くかな。


なんか疲れたのでこのへんで。冒頭の癒しアプリは↓ここからどうぞ。無料です。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20120404