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


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

```swift: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