Takahiro Octopress Blog

-1から始める情弱プログラミング

Swift AFNetworkingライブラリを使ってみよう!

| Comments

通信系ライブラリAFNetworkingの使い方を覚えよう!

さて、本日はObjective-Cの超有名通信系ライブラリのAFNetworkingをSwiftで使ってみようと思います。

導入の仕方

まずは導入の仕方を見て行きましょう。
CocoaPodsを使います。
Podfileを作成し、下記の内容を記載しましょう。

1
2
platform :ios, '7.0'
pod "AFNetworking", "~> 2.0"

これでpod installすればプロジェクトに AFNetworking が追加されるはずです。
ここで注意したいのが、あくまでもObjective-Cで書かれたライブラリなので、Swiftで使うためにはBridgeファイルを用意する必要があります。

  1. プロジェクトにヘッダーファイルを追加します。 ProjectName-Bridging-Header.hという形式が推奨されている模様
    今回はSwiftSample-Bridging-Header.hという名前で追加しました。
  2. TARGETS > SwiftSample > Build Settings > Swift Compiler – Code Generation > Objective-C Bridging Headerにパスを指定 SwiftSample/SwiftSample-Bridging-Header.hを指定しました。
  3. Bridgeファイルにライブラリをimportする
  4. ライブラリを利用するファイルにもimportを書きましょう(Swiftの書き方で。)

下記の画像を参照ください。 Bridgeファイルの用意

また、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) {
      // エラーが発生した場合
  }];

successfailureは戻り値がvoidなので、Swiftでも-> Voidと指定しています。
[String: AnyObject]keyがString型valueがAnyObject(何でもあり)型 のDictionary型への変換で、
[AnyObject]要素がAnyObject(何でもあり)型 のArray型への変換です。

Alamofireとはやはり違った書き方となるので、iOSのターゲットなど要件に従って使い分けていくのが良いでしょう。
と言ったところで本日はここまで。

Comments