INDEX>Foundation>NSURLConnection
解説
継承 | NSObject |
準拠 | NSObject (NSObject) |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | Mac OS X v10.2.7以降 |
iOS 2.0以降 | |
定義 | NSURLConnection.h |
概要
NSURLRequestで指定した接続要求をもとに、ネットワークの接続を行います。
同期の接続と非同期の接続があり、非同期の接続についてはデリゲートに結果がかえされます。
同期接続については受信が完了するまで次の処理に進めないため、ユーザーからは動作が止まったように感じられることになります。そのため、ユーザーインターフェースを扱うメインスレッドでは使用しないことが重要です。
iOS5.0からはブロックオブジェクトでの非同期接続が使用できるようになっています。
接続要求のプリフライト
接続要求が処理できるかどうかを確認するには(+ canHandleRequest)メソッドを使用します。
同期のデータロード
リクエストとレスポンス、エラーでコネクションオブジェクトを作成するには(+ sendSynchronousRequest:returningResponse:error)メソッドを使用します。
データのロードを行うサンプル
#pragma mark NSURLConnection - (IBAction)method007:(id)sender { @autoreleasepool { NSURL *theURL = [NSURL URLWithString:@"http://www.apple.com/"]; NSURLRequest *theRequest=[NSURLRequest requestWithURL:theURL]; NSLog(([NSURLConnection canHandleRequest:theRequest])?@"YES":@"NO"); NSURLResponse* theResponse = nil; NSError* error = nil; NSData* data = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&error]; NSString* result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",result); } }
非同期のデータロード
リクエストとデリゲートでコネクションオブジェクトを作成するには(+ connectionWithRequest:delegate)メソッドを使用します。
allocで作成した後リクエストとデリゲートでコネクションオブジェクトを作成するには(– initWithRequest:delegate)メソッドを使用します。
実行時期を指定して行う場合には(– initWithRequest:delegate:startImmediately)メソッドを使用してstartImmediately:の引数にNOを渡します。(YESを渡す場合は– initWithRequest:delegateメソッドと同じ動作になります。)
その後(– start)メソッドを使用することで通信が始まります。
startを後で行うサンプル
#pragma mark NSURLConnection initWithRequest:delegate:startImmediately - (IBAction)button003:(id)sender { NSURL *theURL = [NSURL URLWithString:@"http://www.apple.com/"]; NSURLRequest *theRequest=[NSURLRequest requestWithURL:theURL]; NSLog(([NSURLConnection canHandleRequest:theRequest])?@"YES":@"NO"); globalConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:NO]; if (globalConnection) { NSLog(@"通信準備完了。ボタン004を押して下さい"); receivedData = [NSMutableData data] ; } } #pragma mark NSURLConnection start - (IBAction)button004:(id)sender { if (globalConnection) { NSLog(@"start loading"); [globalConnection start]; }else{ NSLog(@"通信準備ができていません。先にボタン003を押して下さい。"); } }
ブロックを使って非同期のロードを行うには(+ sendAsynchronousRequest:queue:completionHandler)メソッドを使用します。
ブロックオブジェクトを使った非同期のデータロード。
- (IBAction)button005:(id)sender { NSURL *theURL = [NSURL URLWithString:@"http://www.apple.com/"]; NSURLRequest *theRequest=[NSURLRequest requestWithURL:theURL]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSLog(([NSURLConnection canHandleRequest:theRequest])?@"YES":@"NO"); [NSURLConnection sendAsynchronousRequest:theRequest queue:queue completionHandler:^(NSURLResponse *r, NSData *d, NSError *e) { NSLog(@"%@", r); if (!e) { receivedData = [d mutableCopy] ; NSLog(@"%@", [[NSString alloc]initWithData:receivedData encoding:NSUTF8StringEncoding]); } }]; }
通信を停止する
コネクションを停止するには(– cancel)メソッドを使用します。
デリゲートメッセージのスケジューリング
指定の実行ループで実行させるには(– scheduleInRunLoop:forMode)メソッドを使用します。デリゲートキューをセットするには(– setDelegateQueue)メソッドを使用します。
実行ループとモードを指定してデリゲートメッセージの送信を停止させるには(– unscheduleFromRunLoop:forMode)メソッドを使用します。
デリゲートメッセージのスケジューリングはinitWithRequest:delegate:startImmediately:メソッドのstartImmediately:にNOを渡して初期化し、startメソッドを呼ぶ前にセットしなければなりません。
適合するプロトコル
メソッド
リクエストのプリフライト
データの非同期ロード
+ connectionWithRequest:delegate
– initWithRequest:delegate
– initWithRequest:delegate:startImmediately
+ sendAsynchronousRequest:queue:completionHandler
– start