swiftでのapi通信処理を共通化する方法
はじめに
まだまだ初心者ですが
だいぶレイアウトが作れるようになってきたのでapiを作って動的に画面の内容を出せるようにしています。
やりたいこととしては
・api通信の部分を別クラスにしたい(php開発で例えるとsql処理を別クラスにわけるようなイメージ)
・apiから取得した値をviewにセットして画面に表示したい
phpでのサーバサイドの開発と違って基本的に通信周りは非同期処理になるのでそこがちょっとハマりポイントになるのかなぁとは感じました。(ajax使っていればそうでもないかもしれませんが、、、)
ちなみに、Alamofireというライブラリが非同期通信ではよく使われているようなので今回はこれを使ってみました。
https://github.com/Alamofire/Alamofire
実装方法
SampleViewController.swift
class SampleListViewController: UIViewController {
// APIクラス
var objApiSample = ApiSample()
override func viewDidLoad() {
super.viewDidLoad()
// APIからデータを取得
objApiSample.get(setView)
}
// API通信が完了したときに呼ばれるコールバックメソッド
func setView() {
if (objApiSample.result["error"] != nil) {
// APIでレスポンスエラーなどがかえってきた場合
}
// APIで取得した値をラベルにセット
var label = UILabel()
label.text = objApiSample.result?["data"]?["name"] as? String
self.view.addSubView(label)
}
}ApiSample.swift
import UIKit
import Alamofire
class ApiSample: NSObject {
// API結果保持用
var result: Dictionary<String, AnyObject>! = ["key": []]
func get(callBackClosure:() -> Void) -> Void {
Alamofire
.request(.GET, "http://example.com/path/to/")
.responseJSON { request, response, JSON, error in
var res: Array<Dictionary<String,AnyObject>>?
if let r = JSON as? Array<Dictionary<String,AnyObject>> { res = r }
self.result["error"] = error
self.result["data"] = res
callBackClosure()
}
}
}今回、とりあえずこんな感じで実装してみました。
こんな感じにしておけば、ある程度はパターン化して作業効率が上がるのではないかなぁと思います
swiftが今ひとつわかってなくて、APIから取得したJSONを変数に入れるあたりがすっきりかけないのが課題ではありますが、、、
あと、リスト(UITableView)の中身を動的にするのもけっこうあるので次回はそれのサンプルも書いてみたいと思います
以上です
※こちらにもうちょっとちゃんとまとめてみましたkimagureneet.hatenablog.com