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