2015年2月1日日曜日

swift Alamofireを使う 詳細編

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

コメントを投稿

Related Posts Plugin for WordPress, Blogger...