macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSURLConnectionクラス

INDEX>Foundation>NSURLConnection

apple(OS X)
apple(iOS)

解説

継承 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メソッドを呼ぶ前にセットしなければなりません。

適合するプロトコル