Help us understand the problem. What is going on with this article?

最速ではてなブログリーダー・アプリを作る!

More than 5 years have passed since last update.

この内容は始めたばかりの個人ブログに掲載したのですが、さすがにまだ何も反応がないのでQiitaにも掲載しておくことにしました。

概要

はてなブログには人気エントリーを返すRSSフィードがあるので人気エントリーを表示するアプリを勉強がてらに作ってみました。
Core Data に取得した人気エントリーを保存してるのでオフラインでもみれます。
(ただこのアプリ、表示できるのは人気エントリーの一覧だけです・・・)

http://blog.hatena.ne.jp/-/hotentry/rss

Xcode5から使いやすくなったAuto LayoutやXCTestなどあまりキャッチアップできていなかった部分の勉強や単体テストをちゃんと書くという目的があったのですが、作りっぱなしでは面白くないのでソースコードも公開しています。

https://github.com/asakahara/ASHatenaBlogReader

スクリーンショット

・ブログ一覧画面(縦)
blogScreenshot1.png

・ブログ詳細画面(縦)
blogScreenshot2.png

・ブログ一覧画面(横)
blogScreenshot3.png

・ブログ詳細画面(横)
blogScreenshot4.png

開発後の感想

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からソースを落として試してみてください。

https://github.com/asakahara/ASHatenaBlogReader

今回ははてな教科書を参考にしながら開発してみました。
とても充実した内容で初心者向けのようですが中級者以上の方でも参考になる部分はあると思います。

ご意見や改善点などありましたら是非お聞かせください!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away