2013年8月13日火曜日

[NSData dataWithContentsOfURL:]を使って簡単に非同期HTTP通信を実装する

iPhoneアプリでサーバーと非同期通信してデータを取得したいと思ったら
NSMutableURLRequest
NSURLConnection
NSOperationQueue
を使用して自前で実装したりフリーのライブラリを使用して受信データをNSDataに格納する人が多いと思いますが、実はNSDataには指定されたURLからデータを取得する
/*
 *指定されたurlからデータを取得する
 *@param url データを読み込むurl
 *@param readOptionsMask 読み込んだデータをキャッシュしない等のオプション指定
 *@param errorPtr エラーが発生した際のエラー格納先
 *@return 受信データ
 */
+ (id)dataWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

というメソッドが用意されているんですね。
使い方はいたって簡単で


こんな感じでかなり簡単に実装できます。
が、このdataWithContentsOfURLには重大な欠点があります。
それは非同期では無いという事です。
つまりデータのダウンロードが完了するまでアプリがフリーズしてしまうんですね。

しかし、ご安心くださいGCD(Grand Central Dispatch)というObjective-Cの機能を使用すれば簡単に非同期にすることができるのです。
GCDの簡単な使い方は

dispatch_queue_t q_global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t q_main   = dispatch_get_main_queue();
dispatch_async(q_global, ^{
// ここに非同期(バックグラウンド)で実行したい処理を記述
});

こんな感じです。
GCDを使って先ほどのdataWithContentsOfURLを非同期化すると

こうなります。
ベーシック認証なんかもdataWithContentsOfURLを使用すれば簡単に実装できます。


このエントリーをはてなブックマークに追加

0 件のコメント :

コメントを投稿