iPhone Simple RSS Aggregatorのソース解析メモ
「iPhone向けシンプルなRSSリーダー·iPhone Simple RSS Aggregator MOONGIFT」で紹介されていた、オープンソースのiPhone向けRSSリーダー(iphone-simple-rss-aggregator)のソースをちょっと解析してみた結果をメモしておく。
Google Codeで公開されているiphone-simple-rss-aggregatorは、Charlottesville TomorrowというホームページのRSSを読み込んで表示するという非常にシンプルなRSSリーダーであるが、RSSパーサーのコードは簡単に再利用できるように作られているので、特定のRSS情報を取得して来て利用するという用途には便利そうである。
iphone-simple-rss-aggregatorのソースコードの中で、RSSパーサーの役割を担っているのは、RssParserクラスである(RssParser.m、RssParser.h)。このクラスを利用して特定のサイトのRSSを取得してくる場合、以下のようなコードになる(RSSの取得・解析のみであれば、他のクラスは不要)。
- (void)startReadingRss { // initの引数はフィードの識別子。 // 複数のRSSフィードを読み込む場合にはこの識別子で判別する。 RssParser *parser = [[[RssParser alloc] init:0] autorelease]; // 第1引数にフィードURLを、第3引数にフィードの読み込みが // 完了した後に呼び出してもらうメソッドを指定する。 [parser parse:@"http://d.hatena.ne.jp/tomute/rss2" withDelegate:self onComplete:@selector(finishReadingRss:)] } - (void)finishReadingRss:(RssParser *)objectParser { // データ取得処理の成功確認 if (![objectParser isSuccessful] && ![objectParser isLoading]) { NSLog(@"Feed Not Available."); return; } // RSSのitem要素の配列を取得。 NSArray *rssItems = [objectParser getItems]; // 各item要素はNSDictionaryで格納されているので、 // 以下のようなループ処理でitem要素の子要素の情報を // 取得する事が出来る。 for (NSDictionary *item in rssItems) { // 記事の内容をダンプ。 NSLog(@"title: %@", [item objectForKey:@"title"]); NSLog(@"pubDate: %@", [item objectForKey:@"pubDate"]); NSLog(@"description: %@", [item objectForKey:@"description"]); } // RssParserオブジェクトの解放 [objectParser release]; }
ちなみにRSSの取得処理にはNSURLConnectionが使われているため非同期通信となっている。つまり、RSSParserのparseメソッドを実行したあと、finishReadingRssメソッドが呼び出されるまで他の処理が出来なくなるわけではない。
なお、Atomのフィードは読み込めないようなので、もしこのクラスを使ってAtomのフィードしか提供していないサイトを読み込みたい場合には、FeedBurnnerなどを利用して、ATOMをRSSに変換して、その変換したフィードを読みこませる等の対応が必要である。
【追記1】
RssParserクラスは一部メモリ解放漏れがあるようなので注意が必要である(内部で使用しているNSURLConnection、NSXMLParser、NSMutableDictionaryの解放がきちんと行われていない模様)。
【追記2】
RssParserクラスを一部修正してメモリリークを無くそうと思ったのだが上手く行かず。どうもNSXMLParserクラス自体がメモリーリークという情報もあり。
参考:http://www.iphonedevsdk.com/forum/iphone-sdk-development/4910-nsxmlparser-rssparser-causing-memory-leak.html
【追記3】
タグの属性を取得しようとするとコードに一部修正が必要。