2010年10月13日水曜日

Objective-C + libxml2 を使ってフィードを取り込みたいんだ (5)

前回の(4)は説明不足すぎるような気がする。気が向いたら内容を見直してみる。

とりあえずフィードを読み込むことはできるようになった。
作ったRSSImporterってクラスでは、指定した1つのフィードURLにアクセスしてブログの情報を持ってこれた。



次は、1つだけじゃなくて複数のフィードURLを指定して情報を取得したいと思う。

RSSImporterクラスでは、「指定した1つのフィードURLにアクセスしてブログの情報を持ってこれる。」
っていう作りは変更しない。
変更はしないけど、フィードURLをメソッド内で直接指定するのではなくて、インスタンス作るときに指定するように改良しよう。

- (id)init を使うのやめて、 -(id)initWithRequest: を作ってこっちで初期化処理をすることにする。
  1. //  RSSImporter.h  
  2.   
  3. // これ追加  
  4. - (id)initWithRequest:(NSURLRequest *)requestURL;  

  1. // Rssimporter.m  
  2.   
  3. //  
  4. // これ追加  
  5. //  
  6. // - (id)init { // これ削除  
  7. - (id)initWithRequest:(NSURLRequest *)requestURL {  
  8.       
  9.     self = [super init];  
  10.     if (self != nil) {  
  11.   
  12.         self.isBuffering = NO;  
  13.         self.characterBuffer = [NSMutableData data];  
  14.           
  15.         // パーサ用のコンテクストを作る  
  16.         if (!context) {  
  17.             context = xmlCreatePushParserCtxt(&simpleSAXHandlerStruct, self, NULL, 0, NULL);  
  18.         }  
  19.           
  20.   
  21.         // これ削除  
  22.         //NSString *feedURL = @"http://eyesrobe.blogspot.com/feeds/posts/default?alt=rss";  
  23.         //NSURLRequest *requestURL = [NSURLRequest requestWithURL:[NSURL URLWithString:feedURL]];  
  24.   
  25.         NSURLConnection *urlConnection = [[[NSURLConnection alloc] initWithRequest:requestURL delegate:self] autorelease];  
  26.         if (urlConnection == nil) {  
  27.             NSLog(@"error");  
  28.         }  
  29.     }  
  30.       
  31.     return self;  
  32. }  

これで、RSSImporterのインスタンスを作るときにURLを指定できるようになった。

こんな感じで。
  1. // {YourProject}AppDelegate.m   
  2.   
  3. @interface FooAppDelegate : NSObject <uiapplicationdelegate> {  
  4.     UIWindow *window;  
  5.     FooViewController *viewController;  
  6.   
  7.     // これ削除  
  8.     // RSSImporter *importer;  
  9. }  
  10. </uiapplicationdelegate>  

  1. // {YourProject}AppDelegate.h   
  2.   
  3. // これ削除  
  4. // @synthesize importer;  
  5.   
  6.   
  7. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      
  8.       
  9.     // これを削除  
  10.     // importer = [[RSSImporter alloc] init];  
  11.   
  12.     // これ追加  
  13.     NSString *feedURL1 = @"http://eyesrobe.blogspot.com/feeds/posts/default?alt=rss";  
  14.     NSString *feedURL2 = @"http://blog.eyesrobe.com/feed/rss";  
  15.     NSArray *feeds = [NSArray arrayWithObjects:feedURL1, feedURL2, feedURL1, feedURL2, feedURL1, feedURL2, feedURL1, feedURL2, nil];  
  16.     for (NSString *feedURL in feeds) {  
  17.   
  18.         NSURLRequest *requestURL = [NSURLRequest requestWithURL:[NSURL URLWithString:feedURL]];  
  19.           
  20.         RSSImporter *importer;  
  21.         importer = [[RSSImporter alloc] initWithRequest:requestURL];  
  22.         [importer autorelease];  
  23.     }  
  24.   
  25.       
  26.     [window addSubview:viewController.view];  
  27.     [window makeKeyAndVisible];  
  28.     return YES;  
  29. }  
  30.   
  31.   
  32. - (void)dealloc {  
  33.     // これ削除  
  34.     // [importer release];  
  35.       
  36.     [viewController release];  
  37.     [window release];  
  38.     [super dealloc];  
  39. }  


たくさんのURLを指定するとどうなるかを見たかったので無駄にURLを指定してみた。
NSArray *feeds = [NSArray arrayWithObjects:feedURL1, feedURL2, feedURL1, feedURL2, feedURL1, feedURL2, feedURL1, feedURL2, nil];

で、どうなるかというと、
順番に処理が開始されて、同時並行的に情報の読み込みが行われてる感じになっているっぽい。順番に開始するけど順番に終了はしなくて、読み込み終わった順に終了するってことになるっぽい。

それで何か問題があるかどうか?


『RSSリーダでは、複数のフィードを一度にダウンロードすることが求められる。しかし、数十個のNSURLConnectionを一気に作成したら、帯域を食いつぶしてしまうだろう。』
実践! iPhoneアプリ開発「RSSリーダの作り方 (2) - 複数のダウンロードを並行して処理する」から引用


ってことで、続く。

0 件のコメント:

コメントを投稿