iOS
Swift
Alamofire
SwiftyJSON

Alamofire+SwiftyJSONを使ってサーバーからJSONデータと画像ファイルを取得する方法

More than 3 years have passed since last update.


目的:

 自作サーバーから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しています。


ViewController.swift

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