目的:
自作サーバーからJSONデータと画像ファイルをアプリ側で取得する方法のメモ
環境:
・サーバー側
Golang 1.3.3
Revel
MongoDB
・iOS側
Xcode6.1.1
iOS8
サーバー側は完全に自作でかつオリジナルです。
実装概要:
事前にサーバー側を実装しています。サーバー側で準備したデータはJSONデータです。クライアント(アプリ側)は所定のURLにGET要求出すとJSONデータを取得できるようにしています。画像データは別のURLで取得できるようにしています。
JSONデータは階層化されていて、下に降りていく記述をするとかなり大変でかつ、Debugも困難になるため要素を取り出すのはSwiftyJSONを利用しています。
写真データは取得したJSONデータの中に記載されているため、そのデータからアクセスURLを生成して取得するようにしています。
ソースコードと詳細:
Storyboard上でimageViewを関連付けしておきます。事前に参考資料をもとにAlamofireとSwiftyJSONをセットアップしておきます。アクセスするホストのURL修飾子は事前に設定しています。
let jsonurl = "localhost:9000"
let imageurl = "localhost:8000"
コード内のairportはcascade構造になっているためiatacodeを取り出すには、
let iatacode = objs[index]["airport"]["iatacode"].string!
で取り出しています。
次に、JSONないの配列処理をしています。
流れですが、データをAnyObjectで取り出してforループで中身を取り出すことにしています。
もっと良い方法があったら教えてください。
let imageurls: AnyObject = objs[index]["imageurls"].rawValue // array data
var urls = [String]()
for var j = 0; j < imageurls.count; j++ {
var imageGetUrl = imageurls[j] as String // urls
var url = imageurl + imageGetUrl
urls.append(url)
}
アクセスするURLを配列で準備できたので、それをNSNotificationのobjectで渡します。あとはsenderでしていした先で画像を取得してimageView.imageにUpしています。
import UIKit
import Alamofire
import SwiftyJSON
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
self.imageView.contentMode = UIViewContentMode.ScaleAspectFit
self.imageView.layer.cornerRadius = 30
let jsonurl = "localhost:9000"
let imageurl = "localhost:8000"
var objs:NSArray?
// get JSON data
Alamofire.request(.GET, jsonurl, parameters: nil, encoding: .JSON)
.responseJSON { (request, response, data, error) -> Void in
let objs = JSON(data!) // got data
let count:Int! = objs.count // number of objects
for var index = 0; index < count; index++ {
let iatacode = objs[index]["airport"]["iatacode"].string! // extract the cascaded json data
let imageurls: AnyObject = objs[index]["imageurls"].rawValue // array data
var urls = [String]()
for var j = 0; j < imageurls.count; j++ {
var imageGetUrl = imageurls[j] as String // urls
var url = imageurl + imageGetUrl // make access urls for getting image data
urls.append(url)
}
// post urls
NSNotificationCenter.defaultCenter()
.postNotificationName("getImageData",
object: urls,
userInfo: nil)
}
}// response
// setup observer
NSNotificationCenter.defaultCenter()
.addObserver(self,
selector: "showImage:",
name: "getImageData",
object: nil)
}
// selectror for showImage
func showImage(notification:NSNotification?){
let urls = notification?.object as [String]
let url = urls[0]
// obtain image data
Alamofire.request(.GET, url).response{ (request, response, data, error) in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.imageView.image = UIImage(data: data as NSData)
})
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
参考資料:
http://qiita.com/hideji2/items/14c065d6f00cbf5bf194
http://qiita.com/yukihamada/items/9b0067f905418105a2c6