LoginSignup
26
26

More than 5 years have passed since last update.

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

Posted at

目的:

 自作サーバーから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

26
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
26