読者です 読者をやめる 読者になる 読者になる

iOSアプリ開発の逆引き辞典

iPhone/iPadで使えるアプリ開発のTipsをまとめてみました

JSONファイルを非同期ダウンロードして、JSONデータをパース(デシリアライズ)する

ネットワーク

Windows Azure Mobile Servicesを使った「アルパカ牧場」のオンラインランキングデータを取得するWebAPIを公開しています。レスポンスデータのフォーマットはJSONです。

このAPIを使ってiOSでアルパカ牧場のラインキングデータを表示させてみましょう。

viewDidLoadメソッドにて、refreshメソッドを実行します。refreshメソッドでは、NSURLConnectionクラスを使って非同期的にJSONファイルをダウンロードします。

- (void)refresh
{
    NSURL* url = [NSURL URLWithString:@"https://alpacabokujodata.azure-mobile.net/api/alpacaapi"];
    [NSURLConnection sendAsynchronousRequest:[NSMutableURLRequest requestWithURL:url]
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
                               [self didFinishedDownload:response data:data error:error];
                           }];
}

ネストが深くなるので、ダウンロードが完了した際の処理を分割しました。ダウンロードが完了すると、didFinishedDownload:data:error:メソッドが実行されます。

このメソッドの中では、ダウンロードしたJSONファイルをパースして、NSArrayクラスの配列に格納しなおしています。

- (void)didFinishedDownload:(NSURLResponse *)response data:(NSData *)data error:(NSError *)error
{
    if (error) {
        return;
    }
    
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    if ([httpResponse statusCode] != 200) {
        return;
    }
    
    // ダウンロードしたJSONデータのパースする
    NSError* perseError = nil;
    id json = [NSJSONSerialization JSONObjectWithData:data
                                              options:kNilOptions error:&perseError];
    if (perseError) {
        return;
    }
    
    // ソートができるように配列をNSMutableArrayに詰め替えている
    NSMutableArray *contentArray = [NSMutableArray arrayWithArray:json];
}