Hatena::Groupiphone-dev

iOS プログラミングメモ

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