AFNetworking 3.xへの対応

## 前書き

2015/12/10にリリースされた` AFNetworking 3.0` より` NSURLConnection` ベースのコードが全て削除されてしまいました。
そのため、`AFHTTPRequestOperationManager`をベースに記述していた全てのコードを`NSURLSession`を利用した形に修正しなくてはいけません。


公式から、「AFNetworking 3.0 Migration Guide」といった形でAFNetworking2.xからの移行ガイドが提供されています。
以降のドキュメントはこの内容を英語が堪能では無い私がGoogle翻訳しながらかいつまんで書いていく内容になりますので実際には公式をちゃんと読んだ方がいいかもしれませんね。

以下のバージョンを参考に書いています。（11 days agoだから2016/1/24版かな？）
> AFNetworking 3.0 Migration Guide
> Eugene Dymov edited this page 11 days ago · 17 revisions

◆ AFNetworking 3.0 Migration Guide
https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide


## サポートするOSの変更
* iOS 7+
* Mac OS X 10.9+
* watchOS 2+
* tvOS 9
* Xcode 7. 

より古いOSバージョンで利用したい場合は、READMEを参照して対応しているバージョンを使ってください。
https://github.com/AFNetworking/AFNetworking/blob/master/README.md#requirements


## NSURLConnectionのAPIを削除
 * 旧バージョンへのメンテナンス負担の軽減および`NSURLSession`における将来拡張のサポートを可能にするため
 * そもそもXcode7からは`NSURLConnection`のAPIがAppleから非推奨にされている
 * AFNetworking2.xへの重大なバグやセキュリティに関する修正は続けるが、新規機能の追加はないので移行を推奨。


## 削除されたクラス
* `AFURLConnectionOperation`
* `AFHTTPRequestOperation`
* `AFHTTPRequestOperationManager`


## 修正されたクラス
以下のクラスでは、内部実装に含まれていた`NSURLConnection`のAPIを`NSURLSession`を使用する形にリファクタリングした。
* `UIImageView+AFNetworking.h`
* `UIWebView+AFNetworking.h`
* `UIButton+AFNetworking.h`


## 移行手順
### AFHTTPRequestOperationManager
もし`AFHTTPRequestOperationManager`を利用していた場合は、`AFHTTPSessionManager`へ移行する必要があります。
いくつかのコンポーネントは、これらのクラス（以下を含む）の間で再利用されています。
* `securityPolicy`
* `requestSerializer`
* `responseSerializer`

以下は`AFHTTPSessionManager`へ移行する際の簡単な例になります。
HTTP動詞のメソッド（GETやPOSTなど）が`AFHTTPRequestOperation`ではなく`NSURLSessionTask`を返すことに注意してください。
成功と失敗のblocksでも、`AFHTTPRequestOperation`ではなく`NSURLSessionTask`を渡します。

#### AFNetworking 2.x

```objc
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
```

#### AFNetworking 3.x

```objc
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
```

### AFHTTPRequestOperation
 `NSURLConnection`のオブジェクト（セッション管理、キャッシュポリシー、クッキーの保存、およびURLプロトコル）の設定は、アプリケーション全体にまたがって共有されていましたが`NSURLSession`のオブジェクトでは、個別に設定することになります。
 セッションが特定の構成で初期化されると、それがデータをフェッチするためのタスクを派遣し、ファイルをアップロードまたはダウンロードすることができます。

 AFNetworking2.0では`AFHTTPRequestOperation`にてこ入れして、追加のオーバーヘッドなしで単一のRequestを作成し、リモートデータをフェッチすることが可能でした。
 `NSURLSession`がRequest自体へのアクセスを得るためには、ややオーバーヘッドが必要です。

 単一のRequestをするためには、`AFHTTPSessionManager`からタスクを作成し、それを開始する形になります。


#### AFNetworking2.x
```objc
NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];
```

#### AFNetworking 3.x
```objc
NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:URL.absoluteString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
```

 `NSURLSession`が`NSOperation`の上に構築されていないことに注意してください。
 あなたのアプリケーションが`AFURLConnectionOperation`のNSOperationを使った側面に強く依存している場合、`AFHTTPSessionManager`へ`NSOperation`ベースのアプローチをするための追加開発が必要かもしれません。



## 終わり
と、ここまでが自分に必要な箇所だったので終了。
結局あんまり参考にならなかったのでこれからAFHTTPRequestOperation周りについて再開発します。
NSURLRequestやAFHTTPRequestOperation、Serializerをオーバーライドして拡張してたから排除されちゃってるAFHTTPSessionManagerに移行し辛いんだけどな、と思って読んでたけど特に書いてなかった。。。

残りの箇所、
* Tracking Progress
* UIKit Migrations
* UIAlertView Category has been removed
* Streamlined Example
に関しては特記することもないので。