Skip to content

KissXMLを非同期で活用して、JSONっぽいDictionaryに格納する

2011年7月28日

よく使いそうなのでとりあえずコピペ用にメモ。

KissXMLの設定はlaboさんを参考の元
http://www.hara3.net/blog/2011/04/228.html

.h

#import <UIKit/UIKit.h>
#import "DDXML.h"

@interface podcastList : UITableViewController {

    @private
    NSMutableArray *dataSource_;
    NSMutableData *data_;
    NSInteger statusCode;

}

@end

.m

/// サーバからレスポンスが送られてきたときのデリゲート
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"didReceiveResponse");
    NSLog(@"ステータスコート判別----------");
	NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
	statusCode = [res statusCode];
}

/// サーバからデータが送られてきたときのデリゲート
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"didReceiveData %@",data);
    //分割されたデータを統合
    [data_ appendData:data];
}

/// データのロードか完了した時のデリゲート
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"connectionDidFinishLoading");   
    if (statusCode == 200) {
        NSLog(@"Code200 : 通常処理");
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

        DDXMLDocument *doc = [[[DDXMLDocument alloc] initWithData:data_ options:0 error:nil] autorelease];
        DDXMLElement *root = [doc rootElement];

        NSArray *title           = [root nodesForXPath:@"/rss/channel/item/title" error:nil];
        NSArray *description     = [root nodesForXPath:@"/rss/channel/item/description" error:nil];
        NSArray *pubDate         = [root nodesForXPath:@"/rss/channel/item/pubDate" error:nil];
        NSArray *link            = [root nodesForXPath:@"/rss/channel/item/link" error:nil];
        NSArray *itunes_subtitle = [root nodesForXPath:@"/rss/channel/item/itunes:subtitle" error:nil];

        NSMutableArray *dataArray = [[NSMutableArray alloc] init];
        for (int i = 0; i < [description count]; ++i) {
            NSMutableDictionary *tmpDic = [[NSMutableDictionary alloc] init];
            [tmpDic setObject:[[title objectAtIndex:i] stringValue] forKey:@"title"];
            [tmpDic setObject:[[description objectAtIndex:i] stringValue] forKey:@"description"];
            [tmpDic setObject:[[pubDate objectAtIndex:i] stringValue] forKey:@"pubDate"];
            [tmpDic setObject:[[link objectAtIndex:i] stringValue] forKey:@"link"];
            [tmpDic setObject:[[itunes_subtitle objectAtIndex:i] stringValue] forKey:@"itunesSubtitle"];
            [dataArray addObject:tmpDic];
            [tmpDic release];
        }
        [dataSource_ setArray:dataArray];
        [dataArray release];
        [self.tableView reloadData];
    } else {
        NSLog(@"Code%d : エラー処理",statusCode);
        [connection cancel];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    }

}

/// サーバからエラーが返されたときのデリゲート
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"didFailWithError");
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"エラー" message:@"情報の取得に失敗しました" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
    [alert release];
}

- (NSURLRequest *)requestMaker:(NSString *)getURL{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    data_ = [[NSMutableData alloc] init];
    NSString *urlStr = [[NSString alloc] initWithFormat:@"%@",getURL];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
    [urlStr release];
    return request;
}

- (void)xmlParse{
    NSString *urlString = [NSString stringWithFormat:@"http://be-side.jp/podcast/index.xml"];
    NSURLRequest *request = [self requestMaker:urlString];
    [NSURLConnection connectionWithRequest:request delegate:self];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    dataSource_ = [[NSMutableArray alloc] init];
    self.navigationController.navigationBarHidden = NO;
    [self xmlParse];
}

これでdataSource_に、配列のセルひとつひとつに、RSSのアイテム情報Dictionaryが入ってくるかんじ。

 

 

 

 

広告

From → iPhone開発

コメントする

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。