現在的 App ,已經很少單純只用到手機功能而沒有網路功能的。 Alamofire 是 iOS 開發中很知名的套件,有超過 200 個開發者貢獻過這個套件,星星數超過 60k。
這次鐵人賽在網路溝通上,會使用這個套件協助開發。安裝過程在 repo 的 Readme 有詳細的說明,使用方法也在 Readme 上。
https://github.com/Alamofire/Alamofire
開發架構上,我選擇使用 Apple 官方文件推薦的 MVC 架構,細節可以看 Stanford CS193P 過去的課程。
Stanford CS193P - MVC
https://www.youtube.com/watch?v=gI3pz7eFgfo
如果 MVC 運作的合理,那你的物件傳遞值的時候,看起來像這樣
https://www.youtube.com/watch?v=gI3pz7eFgfo
如果 MVC 運作的不合理,App 還是可以運作,但他看起來會像這樣
網路溝通這一塊,我視為 Model,而呼叫方法,我習慣寫個 Adapter 將第三方元件包住,不讓其他物件直接呼叫第三方元件。
//
// AlamofireAdapter.swift
// ITIronMan
//
// Created by Marvin on 2021/9/3.
//
import Foundation
import Alamofire
class AlamofireAdapter {
private lazy var session: Session = {
return Session()
}()
func requestForString(_ urlConvertible: URLConvertible, method: HTTPMethod, parameters: Parameters? = nil, headers: HTTPHeaders? = nil, completion: @escaping ((Result<String, Error>) -> Void)) {
session.request(urlConvertible, method: method, parameters: parameters, headers: headers)
.responseString { response in
let result = response.result
switch result {
case .success(let string):
completion(.success(string))
case .failure(let error):
completion(.failure(error))
}
}
}
func request(_ urlConvertible: URLConvertible, method: HTTPMethod, parameters: Parameters? = nil, headers: HTTPHeaders? = nil, completion: @escaping ((Data?, HTTPURLResponse?, Error?) -> Void)) {
session.request(urlConvertible, method: method, parameters: parameters, headers: headers)
.validate(statusCode: 200..<300)
.response { afResponse in
completion(afResponse.data, afResponse.response, afResponse.error)
}
}
}
這邊有一個 func 開出 requestForString() 的原因,在公開資訊上,很多檔案的格式都是 CSV 檔,而這些檔案在回到 App 的時候,是一連串 string,後續會用處理 CSV 檔案的第三方套件,進行處理。
接下來,在 ViewController 的 viewDidLoad() 中進行呼叫,並試著打網路上的免費的 API
"https://jsonplaceholder.cypress.io/todos/1"
VC 的程式碼如下
//
// LandingViewController.swift
// ITIronMan
//
// Created by Marvin on 2021/9/3.
//
import UIKit
class LandingViewController: UIViewController {
private lazy var alamofireAdapter: AlamofireAdapter = {
return AlamofireAdapter()
}()
override func viewDidLoad() {
super.viewDidLoad()
requestPlaceholderAPI()
}
private func requestPlaceholderAPI() {
let urlString = "https://jsonplaceholder.cypress.io/todos/1"
alamofireAdapter.request(urlString, method: .get) { data, response, error in
if let error = error {
print("you got error: \(error.localizedDescription)")
return
}
if let data = data {
print("you got data: \(String(data: data, encoding: .utf8))")
}
}
}
}
在 run 完模擬器後並進入畫面後,你應該可以看到下方印出 Todo 的資訊。
you got data: Optional("{\n "userId": 1,\n "id": 1,\n "title": "delectus aut autem",\n "completed": false\n}")
如果看到 console 印出這樣的資訊,就表示發動 request 成功,也成功的拿到回應。