この内容は始めたばかりの個人ブログに掲載したのですが、さすがにまだ何も反応がないのでQiitaにも掲載しておくことにしました。
概要
はてなブログには人気エントリーを返すRSSフィードがあるので人気エントリーを表示するアプリを勉強がてらに作ってみました。
Core Data に取得した人気エントリーを保存してるのでオフラインでもみれます。
(ただこのアプリ、表示できるのは人気エントリーの一覧だけです・・・)
Xcode5から使いやすくなったAuto LayoutやXCTestなどあまりキャッチアップできていなかった部分の勉強や単体テストをちゃんと書くという目的があったのですが、作りっぱなしでは面白くないのでソースコードも公開しています。
スクリーンショット
開発後の感想
Auto Layoutは正直かなりよかったです!
これまでUILabel
の高さを可変にする表示はNSString:sizeWithFont:constrainedToSize:lineBreakMode:
を使って毎回計算してました。
Auto Layoutの使う場合、制約の設定さえちゃんとしておけばUILabel
の高さ調整は勝手にやってくれます。
(もっと早く知っておきたかった・・・)
勝手にやってくれるんで sizeToFit
などのメソッドをプログラムから呼び出さないようにしましょう。
ただ一つ問題として横画面にも対応させたのですが、縦から横画面へした際にStoryBoardから設定した制約だけではUILabel
の横幅の制御がどうもうまくいきません。
仕方なくUILabel.preferredMaxLayoutWidthを横画面のサイズに併せて変更かけることで対応しています。
- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label
{
label.preferredMaxLayoutWidth = [label alignmentRectForFrame:label.frame].size.width;
}
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// 横画面にした際にラベルの横幅が縦画面のサイズのままになってしまうため、
// preferredMaxLayoutWidthを画面サイズに併せて調整する
[self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.bodyLabel];
[self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.titleLabel];
[self.view layoutSubviews];
}
その他にもCore Data用に初めて使ったMagicalRecordは思った以上に便利でした。
特にマルチスレッドでCore Dataを扱う部分をかなり楽にしてくれます。
MagicalRecordのドキュメントにあったサンプルを見てもらえば納得してもらえると思います。
Person *person = ...;
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){
Person *localPerson = [person MR_inContext:localContext];
localPerson.firstName = @"John";
localPerson.lastName = @"Appleseed";
} completion:^{
self.everyoneInTheDepartment = [Person findAll];
}];
ブロック内に書いた処理を全て別スレッドで処理を行い、完了ブロックはメインスレッドで動作します。
あと単体テストはXCTestを使って最低限のモデルのテスト書いてます。
HTTP通信周りはOHHTTPStubs使ってやってます。
まとめ
細かい説明を書く余裕がないので興味がある方はGitHubからソースを落として試してみてください。
今回ははてな教科書を参考にしながら開発してみました。
とても充実した内容で初心者向けのようですが中級者以上の方でも参考になる部分はあると思います。
ご意見や改善点などありましたら是非お聞かせください!