LoginSignup
0
1

More than 3 years have passed since last update.

忘備録-iOSの通信できるアプリ

Posted at

趣味でiOSアプリ開発をかじっていた自分が、改めてiOS開発を勉強し始めた際に、曖昧に理解していたところや知らなかったところをメモしています。いつか書き直します。

参考文献

この記事は以下の書籍の情報を参考にして執筆しました。

メイン実行ループとスレッドの基本

イベント処理の概要図

image.png

メインスレッドとワーカースレッド

メインキュー : イベントキューの中のUIの操作や更新を行うためのキュー。
メインスレッド : メインキューからイベントを取り出して処理をするスレッド。

メイン処理で時間がかかる処理を行うと、そのUIの更新処理がされないためアプリがフリーズして見える。

ワーカスレッド : 時間がかかる処理を行う用のスレッド。メインキューとは別のスレッドを持つ。UIの更新はできない。

image.png

通信を行うサンプルコード

gooラボ様のひらがな化APIを叩くサンプル。
入力した文字列の読み方を表示する。

APIsample.gif

image.png

storyboard
image.png

import UIKit

class ViewController: UIViewController {

  @IBOutlet weak var resultDisplay: UITextView!
  @IBOutlet weak var textField: UITextField!
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
  }

  @IBAction func tapButton(_ sender: Any) {
    if let text = textField.text {
      hiraganaConversion(sentence: text)
    }
  }

  func hiraganaConversion(sentence: String) {
    let url = URL(string: "https://labs.goo.ne.jp/api/hiragana")
    guard let requestUrl = url else { return }

    let httpBody = getHttpBody(sentence: sentence, outPutType: "hiragana")
    let postUrl = createPostUrl(requestUrl: requestUrl, httpBody: httpBody)
    postRequest(request: postUrl)
  }

  func getHttpBody(sentence: String, outPutType: String) -> String{
    let appId = ****API_Keyを入力してください*****
    let outPutType = outPutType
    return "app_id=\(appId)&sentence=\(sentence)&output_type=\(outPutType)"
  }

  func createPostUrl(requestUrl: URL, httpBody: String) -> URLRequest {
    var request = URLRequest(url: requestUrl)
    request.httpMethod = "POST"
    request.httpBody = httpBody.data(using: .utf8)
    return request
  }

  func postRequest(request: URLRequest){
    let session = URLSession.shared
    let task = session.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
      // 通信終了後の処理

      // エラーの場合、本当はちゃんとエラー表示とかするべき
      guard error == nil else { return }
      guard let data = data else { return }
      do {
        let decoder = JSONDecoder()
        // ここでスネークケースの変数名をキャメルケースに置き換えている
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        let result = try decoder.decode(ResultSet.self, from: data)
        print(result.converted)
        // ラベルに描画する処理を実施。ここでメインキューにイベントを渡す
        DispatchQueue.main.async {
          self.resultDisplay.text = result.converted
        }
      } catch {
        print("error")
      }
    }
    // 通信開始
    task.resume()
  }

}

class ResultSet: Codable {
  let converted: String
  let outputType: String
  let requestId: String
//  // スネークケースの変数名をキャメルケースに置き換える方法その2
//  private enum CodingKeys: String, CodingKey{
//    case converted
//    case outputType = "output_type"
//    case requestId = "request_id"
//  }
}

0
1
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
0
1