ラベル検索を実現するために必要な仕組みは以下の 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 件のコメント:
コメントを投稿