通信系ライブラリAFNetworkingの使い方を覚えよう!
さて、本日はObjective-Cの超有名通信系ライブラリのAFNetworkingをSwiftで使ってみようと思います。
導入の仕方
まずは導入の仕方を見て行きましょう。
CocoaPodsを使います。
Podfileを作成し、下記の内容を記載しましょう。
1
2
| platform :ios, '7.0'
pod "AFNetworking", "~> 2.0"
|
これでpod install
すればプロジェクトに AFNetworking が追加されるはずです。
ここで注意したいのが、あくまでもObjective-Cで書かれたライブラリなので、Swiftで使うためにはBridgeファイルを用意する必要があります。
- プロジェクトにヘッダーファイルを追加します。
ProjectName-Bridging-Header.hという形式が推奨されている模様
今回はSwiftSample-Bridging-Header.hという名前で追加しました。
- TARGETS > SwiftSample > Build Settings > Swift Compiler – Code Generation > Objective-C Bridging Headerにパスを指定
SwiftSample/SwiftSample-Bridging-Header.hを指定しました。
- Bridgeファイルにライブラリを
import
する
- ライブラリを利用するファイルにも
import
を書きましょう(Swiftの書き方で。)
下記の画像を参照ください。
また、Bridgeファイルへの具体的な内容を書いておきます。
1
2
3
4
5
6
| #ifndef SwiftSample_SwiftSample_Bridging_Header_h
#define SwiftSample_SwiftSample_Bridging_Header_h
#endif
#import <AFNetworking/AFNetworking.h>
|
GETリクエスト
では、早速、GETリクエストを書いてみましょう。
以前のAFNetworking2.xでWeb-APIを叩いてみた!でも利用した OpenWeatherMap API を例として使います。
http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp
でリクエストして、
下記のデータを返してもらうことを想定しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| {
base: "stations",
clouds: {
all: 32
},
cod: 200,
coord: {
lat: 35.69,
lon: 139.65
},
dt: 1432394992,
id: 1850147,
main: {
grnd_level: 1019.97,
humidity: 88,
pressure: 1019.97,
sea_level: 1024.92,
temp: 290.99,
temp_max: 290.99,
temp_min: 290.99
},
name: Tokyo,
sys: {
country: "JP",
message: 0.0386,
sunrise: 1432323041,
sunset: 1432374314
},
weather: [
{
description: "scattered clouds",
icon: "03n",
id: 802,
main: "Clouds"
}
],
wind: {
deg: 198.001,
speed: 5.11
}
}
|
では、GETリクエストを投げてみましょう。
返却されたデータの取得方法についても記載します。
1
2
3
4
5
6
7
8
9
10
11
12
13
| // GETリクエスト
let manager = AFHTTPSessionManager()
manager.GET("http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp", parameters: nil,
success: { (operation, json) -> Void in
// 処理が成功した場合
let dict = json as! [String: AnyObject]
let weatherArray = dict["weather"] as! [AnyObject]
let weather = weatherArray[0] as! [String: AnyObject]
let description = weather["description"] as! String
println(description)
}, failure: { (operation, error) -> Void in
// エラーが発生した場合
})
|
Objective-Cでは下記のように書いていたので、対応づけて見るとわかりやすいかもしれません。
1
2
3
4
5
6
7
8
9
10
| AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager.GET:@"http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp", parameters: nil,
success:^(NSURLSessionDataTask *task, id responseObject) {
NSArray *weatherArray = [responseObject objectForKey:@"weather"];
NSDictionary *weather = [weatherArray objectAtIndex:0];
NSString *description = [weather objectForKey:@"description"];
NSLog(description);
}, failure:^(NSURLSessionDataTask *task, NSError *error) {
// エラーが発生した場合
}];
|
success
とfailure
は戻り値がvoid
なので、Swiftでも-> Void
と指定しています。
[String: AnyObject]
は keyがString型 で valueがAnyObject(何でもあり)型 のDictionary型への変換で、
[AnyObject]
は 要素がAnyObject(何でもあり)型 のArray型への変換です。
Alamofireとはやはり違った書き方となるので、iOSのターゲットなど要件に従って使い分けていくのが良いでしょう。
と言ったところで本日はここまで。