今回は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 件のコメント:
コメントを投稿