iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0
Mobile Development

使用 Swift 和公開資訊,打造投資理財的 Apps系列 第 3

D3-用 Swift 和公開資訊,打造投資理財的 Apps { 使用 Alamofire 套件進行 URLRequest }

現在的 App ,已經很少單純只用到手機功能而沒有網路功能的。 Alamofire 是 iOS 開發中很知名的套件,有超過 200 個開發者貢獻過這個套件,星星數超過 60k。

這次鐵人賽在網路溝通上,會使用這個套件協助開發。安裝過程在 repo 的 Readme 有詳細的說明,使用方法也在 Readme 上。

https://github.com/Alamofire/Alamofire

MVC 架構

開發架構上,我選擇使用 Apple 官方文件推薦的 MVC 架構,細節可以看 Stanford CS193P 過去的課程。

Stanford CS193P - MVC
https://ithelp.ithome.com.tw/upload/images/20210913/20140622Zqlkm5fSSN.jpg

https://www.youtube.com/watch?v=gI3pz7eFgfo

如果 MVC 運作的合理,那你的物件傳遞值的時候,看起來像這樣
https://ithelp.ithome.com.tw/upload/images/20210913/20140622wc4YdeP5Mn.jpg

https://www.youtube.com/watch?v=gI3pz7eFgfo

如果 MVC 運作的不合理,App 還是可以運作,但他看起來會像這樣
https://ithelp.ithome.com.tw/upload/images/20210913/201406227jDHNdD7ZS.jpg

網路溝通這一塊,我視為 Model,而呼叫方法,我習慣寫個 Adapter 將第三方元件包住,不讓其他物件直接呼叫第三方元件。

程式碼 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 成功,也成功的拿到回應。


上一篇
D2- 用 Swift 和公開資訊,打造投資理財的 Apps { 加上版控 git 和第三方套件管 理工具CocoaPods }
下一篇
D4-用 Swift 和公開資訊,打造投資理財的 Apps { 下載公司股票代號和股票名稱等基本資料 }
系列文
使用 Swift 和公開資訊,打造投資理財的 Apps37

尚未有邦友留言

立即登入留言