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

知行合一

とか言ってみる

【Objective-C】NSURLConnectionとNSURLSessionの違い

Objective-C

NSURLConnectionとNSURLSessionの違い。
ほとんど下記リンクの内容で勉強のために書き写した感じなので下記リンクを見た方が良いです。
参考
iOS 7で一新された通信周り〜NSURLSessionってなに?〜 | Developers.IO


◼︎NSURLConnection: NSObject
WebサーバやファイルサーバなどのデータソースからURLを指定してデータを非同期で取得することができるクラス。
通信処理中にアプリ全体をブロックさせないように通信処理を書くことができる.

(A)NSURLConnectionを用いた非同期通信には、
このクラス以外に3人の登場人物がいる。

・(B)NSURLRequest
・(C)NSURLResponse
・(D)デリゲートオブジェクト

(B)の生成 > そのインスタンスに対して
通信先のURL
タイムアウト
キャッシュ
認証方法
などの設定を行う。

(A)は(B)のインスタンスと(D)を指定してインスタンスの生成と同時に
データの取得を行う。
(→この時のイベント(取得開始、終わり、etc...)はデリゲートメソッドで)

アクセス先のデータソースから送られるステータスコードやHTTPヘッダなどの
レスポンスは(C)に設定されて、デリゲートメソッドの引数として渡される。

以上で非同期通信ができる。

デメリット
データ取得ごとに設定を都度行わないといけない。しかし、ほとんどのアプリはURLが変更されてもタイムアウトやキャッシュのポリシー、認証に関する設定は基本的に共通。

この設定を共通化するために、singletonクラスを用意して
NSURLRequestを生成するメソッドを独自に定義することが多い。
で、このめんどくさいのが改善されたのがNSURLSession。

◼︎NSURLSesstion
とりあえずNSURLConnectionより便利らしい。
タイムアウトやキャッシュのポリシー、認証に関する設定を共通化できるように予め設計されてるから。
singletonクラスやリクエストのサブクラスを作成する手間が省けるらしい。


◼︎AFNetworkingみたいな記述が標準でもできる
NSURLConnection→delegate用のクラスやメソッドを用意。AFNetworkingを使用すれば成功・失敗のコールバックにブロックが使用できる。

NSURLSession→AFNetworkingみたいな記述が標準でも可能に!

◼︎バックグラウンドでダウンロード・アップロード処理が行える
OS側でバッテリーの持ち具合とか見て動作するらしい。iOS7より加わったプッシュ通知や定期的なフェッチ処理などと組み合わせて使うことで効果を発揮するらしい。(すごいね)

//NSURLConnection example
// NSURLConnection example:
id<NSURLConnectionDelegate> myDelegate = [[MyDelegate alloc] init];
 
for (int i = 0; i < 10; i++) {
    NSURL* myURL = [NSURL URLWithString:@”http://www.apple.com/”];
    NSURLRequest* myRequest = [NSURLRequest requestWithURL:myURL];
    [myRequest setAllowsCellularAccess:NO];
    NSURLConnection* conn;
    conn = [NSURLConnection connectionWithRequest:myRequest
                                         delegate:myDelegate];
}
// NSURLSession example:
id<NSURLSessionDelegate> myDelegate = [[MyDelegate alloc] init];
 
NSURLSessionConfiguration* myConfiguration = [NSURLSession defaultSessionConfiguration];
myConfiguration.allowsCellularAccess = NO;
 
NSURLSession* mySession = [NSURLSession sessionWithConfiguration:myConfiguration
                                                        delegate:myDelegate
                                                   delegateQueue:[NSOperationQueue mainQueue];
 
for (int i = 0; i < 10; i++) {
    NSURL* myURL = [NSURL URLWithString:@”http://www.apple.com/”];
    NSURLSessionDataTask* task;
    task = [mySession dataTaskWithHTTPGetRequest:myURL];
}

※そのままコピペ。
サイトに10回アクセスすることを考えた時に、NSURLConnectionではループ内で都度コネクションとリクエストを生成して設定している(ここではallowsCellularAccessをNOに(??))ということ。
NSURLSesstionではループの外でNSURLSesstionConfigurationインスタンスに対して設定を行うようになっている。