この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
iOS 7で一新された通信周り〜NSURLSessionってなに?〜でも書きましたが、iOS 7でAFNetworkingみたいな書き方で通信処理が実装できるようになりました!これは便利!
・・・と言いたいところですが、厳密に言うとiOS 7では非同期通信の実装がより簡単に書けるようになりました!ってな感じでしょうか。NSURLConnectionでもそれっぽく書けましたもんね。
少なくともNSURLConnectionよりはNSURLSessionで書いた方がより書きやすいです。実際にソースコードを見てみましょう。
WebサイトのHTMLを文字列として取得する例を見てみましょう。まずは、AFNetworkingを使った場合の書き方です。
AFNetworkingを使った場合
NSURL *url = [NSURL URLWithString:@"https://classmethod.jp/"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// 通信が正に常終了したときの処理
NSLog(@"%@", operation.responseString);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 通信が異常終了したときの処理
・・・
}];
// 通信開始
[operation start];
これをNSURLSessionを使って書いてみましょう。
NSURLSessionを使った場合
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"https://classmethod.jp/"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionTask *task = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
// 通信が異常終了したときの処理
・・・
return;
}
// 通信が正に常終了したときの処理
NSLog(@"data : %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
// 通信開始
[task resume];
ほとんど同じように書けますね。また、以下のように直接URLを指定することもできます。
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"https://classmethod.jp/"];
NSURLSessionTask *task = [session dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
// 通信が異常終了したときの処理
・・・
return;
}
// 通信が正に常終了したときの処理
NSLog(@"data : %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
// 通信開始
[task resume];
非常に簡単に書けるようになりましたね!ちなみにデリゲートパターンで書く場合は以下のように書きます。以下のサンプルではViewControllerで呼び出してる感じです。
@interface ViewController () <NSURLSessionDataDelegate>
@end
@implementation ViewController
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURL *url = [NSURL URLWithString:@"https://classmethod.jp/"];
NSURLSessionTask *task = [session dataTaskWithURL:url];
[task resume];
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"%s", __func__);
}
今回はここまで!次回はNSURLSessionUploadTaskとNSURLSessionDownloadTaskについて書きたいと思います。