今回はAlamofireを使ってAPIからデータを取得するコードを詳細に実装していきます。
Alamofireの導入方法はここに記載済みです。
環境
- Xcode Version 6.1 (6A1052d)
AlamofireでAPIデータ取得
以下は公式サイトの例を元に作成したコード
Alamofire.request(.GET, "http://test/api/v1/tests", parameters: ["offset": 0, "limit": 1, "test_id": 1]) .responseJSON { (request, response, JSON, error) in if (response?.statusCode == 200) { println("success") println(JSON) } else { // error println(error) } }
上記の処理に例外処理を追加したのが以下の処理になります
/** APIXXXXに接続する. */ func connect() { Alamofire.request(.GET, "http://test/api/v1/tests", parameters: ["offset": 0, "limit": 1, "test_id": 1]) .responseJSON { (request, response, data, error) in if (response?.statusCode == 200) { println("success") let json = SwiftyJSON.JSON(data!) println(json) return; } self.showAlertView(response) } } /** AlertViewを表示. :response: HTTPレスポンス. */ func showAlertView(response :NSHTTPURLResponse?) { // 定数 var const = Const() // API共通処理 var apiCommon = APICommon() var alert = UIAlertView() // Optional型の変数が値をもっていた場合(responseが返ってきた場合)の処理 if (response != nil) { println("is response") alert.title = apiCommon.getAlertTitle(response!.statusCode) alert.message = apiCommon.getAlertMessage(response!.statusCode) // Optional型の変数が値をもっていない場合(responseが返ってこない場合)の処理 } else { println("no response") alert.title = apiCommon.getAlertTitle(0) alert.message = apiCommon.getAlertMessage(0) } alert.addButtonWithTitle("OK") alert.show() }
変更後のコードの説明
Alamofireの結果のresponseはoptional value宣言で実装されています。そのため、
!を付けた場合は変数の中身がnilだと実行時にエラーになり、?を付けた場合は変数の中身がnilだとエラーにはなりません。
responseの中身がnilの場合というのはサーバーが落ちている場合です。
上記の例では、nil(サーバーが落ちている)の場合は、UIAlertViewでサーバーが利用できない旨の表示をする実装をしています。
nil以外(レスポンスはあるが200以外のステータスコードが返ってくる)の場合は、共通クラスでステータスコードに応じたタイトルとメッセージを取得してUIAlertView画面を表示しています。
swiftで実装する場合、optional valueかどうかを意識することがかなり重要になります。というのは、!を付けた場合は変数の中身がnilだと実行時にエラーになります。つまり、実際にアプリを動かしてからエラーが発生します。
プログラミングは習うより慣れろなので、swiftを実装する際は、いつも通りのコーディングパターンに落としこむのでなく、色々なパターンを試してみると良いでしょう。
以上
追伸 : swiftのプログラムコメントはここを参考にしています。
0 件のコメント:
コメントを投稿