2010-12-21

ラベル検索の実装 #1 (MacBloggerGlass)

ラベル検索を実現するために必要な仕組みは以下の 2 つ。

  • ラベルの列挙
  • 指定されたラベルの付いた記事の抽出

今回は、まず簡単な方、ラベルの列挙を実装してみる。

GDataCategory

GData ライブラリで Blogger の記事は GDataEntryBlogPost クラスが表現している。各記事に付けられたラベルはこのクラスの categories というプロパティに収められている(実際に categories が定義されているのは GDataEntryBlogPost の基底クラスである GDataEntryBase)。このプロパティは NSArray として取り出すことができ、その各要素は GDataCategory クラスのインスタンスになっている。

もともと、Blogger の記事データを表す Atom フィードでは、カテゴリは以下のような XML 要素として表現されている。この term 属性が Blogger の記事に付けたラベルになっている。

<category
    scheme="http://www.blogger.com/atom/ns#"
    term="1. Macをプログラムする">
</category>

GDataCategory クラスには上記の term 属性を参照するための term プロパティが定義されている。ややこしいことに label というプロパティも定義されているが、こちらは Blogger のラベルとは関係ない。

実装

Entry クラス

Entry クラスでは、内部に抱えた GDataEntryBlogPost の categories プロパティから各 GDataCategory のインスタンスの term プロパティを取り出し、NSArray の一時オブジェクトとして返すメソッド(プロパティへのアクセサ)を定義した。

- (NSArray *)labels {
    NSArray *categories = [gDataEntry categories];
    if (! categories) return nil;
    NSMutableArray *lbls = [NSMutableArray arrayWithCapacity:[categories count]];
    GDataCategory *category;
    for (category in categories) {
        [lbls addObject:[category term]];
    }
    return lbls;
}
Feed クラス

Feed クラスでは、初期化時に各 Entry からラベルを(上述の labels メソッドで)取り出し、NSMutableSet にまとめておき、labels プロパティとして保持するコードを追加した。

- (void)gatherLabels {
    labels = [[NSMutableSet alloc] init];
    Entry *entry;
    NSString *label;
    for (entry in entries) {
        for (label in entry.labels) {
            [labels addObject:label];
        }
    }
}

配列ではなく集合を使ったのは、集合は addObject 時に要素の重複を排除してくれるから。

FeedManager クラス

また、内部に抱えた Feed インスタンスの labels プロパティをそのまま返す、同名のプロパティを FeedManager クラスにも用意することにした。アプリコントローラからは FeedManager 経由でアクセスすることにしたいから。

次は?

ラベルの「見せ方」を考えているところだが、まずは単純にドロワー(NSDrawer)に NSTableView でラベルを列挙する方式にするつもり。

ドロワーは最近ではあまり見かけなくなったけど、標準で用意されている部品だし、使わないときは隠しておけるし。

関連記事

0 件のコメント:

コメントを投稿