LoginSignup
50
53

More than 5 years have passed since last update.

簡単にSwiftでRailsと連携する方法

Last updated at Posted at 2015-06-14

Swiftをはじめて1ヶ月あたりでアプリを作ってみた。
その中でどうせならRailsと連携してDBを使いたかったので、導入してみたときの記録。

今回はHTTP通信部分(GET・POST)の記述のみを簡単に紹介。

ちなみにRailsはscaffoldでさくっと作成。
.json.jbuilderのひな形みたいなのも作ってくれたのでよかった。

データ受信(GET)

Swift側

ViewController/HomeTableViewController.swift

func loadDiaries() {
        let url = NSURL(string: "http://localhost:4000/diaries.json")
        var request = NSMutableURLRequest(URL: url!)

        request.HTTPMethod = "GET"

        var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, responce, error) -> Void in

            if (error == nil) {
                self.diaries.removeAll(keepCapacity: false)
                var diaries = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! Array<Dictionary<String, AnyObject>>

                for diaryInfo in diaries {
                    let diary = Diary(attributes: diaryInfo)
                    self.diaries.append(diary)
                }
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    self.tableView.reloadData()
                })
            } else {
                // when error
            }
        })
        task.resume()
    }

Rails側

views/diaries/index.json.jbuilder

json.array!(@diaries) do |diary|
  json.extract! diary, :id, :name, :title, :text, :created_at
  json.url diary_url(diary, format: :json)
end

データ送信(POST)

簡単にいうと、
配列にデータをいれて、URLとHTTPメソッドを指定して送るだけ。

Swift側

ViewController/NewDiaryViewController.swift

func save() {
        var url = NSURL(string: "http://localhost:4000/diaries")
        var request = NSMutableURLRequest(URL: url!)

        request.HTTPMethod = "POST"

        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        var params: [String: AnyObject] = [
            "name": "ただち",
            "title": titleField.text,
            "text": textField.text
        ]

        request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: nil)

        var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
            if (error == nil) {
                var result = NSString(data: data, encoding: NSUTF8StringEncoding)!
            }
        })
        task.resume()
        close()
    }

保存ボタンを押したときこのメソッドが走るように設定。

Rails側にSwift用の記述はしなくて大丈夫です。

その他

プロジェクトは以下。
https://github.com/yuta-t/today

制作期間2日くらい。

50
53
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
50
53