iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Mobile Development

自己的 app 自己寫系列 第 26

[Day26] 假日總是過得特別快

  • 分享至 

  • xImage
  •  

放了一天假怎麼到了晚上有點小空虛。
另外再講一次黑白大廚好好看,好想要到處搜刮米其林餐廳喔可惜大部分都有點爆預算QQ


Swift 中用來處理 HTTP 請求的方法是透過 URLSession,方法大概是用既有的函式去發出請求,然後處理回傳的資料。在下方的範例中,guard let 這邊是會對 url string 做格式上的確認,後續再發送請求拿資料。而 URLSessionTask 被創建後並不會被自動執行,因此要用 .resume 來啟動。

func fetchData() {
    guard let url = URL(string: "https://www.api.com/category/1") else { return }

    let request = URLRequest(url: url)

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            print("Error: \(error.localizedDescription)")
            return
        }

        guard let data = data else {
            print("No data received.")
            return
        }

        do {
            // ...
        } catch {
            // ...
        }
    }

    task.resume()
}

URLSession.shared 會創建一個可以被共用的 instance,這個東西可以在整個 app 中被使用,不用每次都額外創建新的 instance 浪費資源。URLSession.shared 底下有幾個常用的函式,像是 dataTask, downloadTask, uploadTask 等。

如果需要自定義的 URLSession,可以創建不同的 URLSessionConfiguration,然後再把 config 丟回 URLSession 裡。常見的選項包含 URLSessionConfiguration.default,可以調整 request 細節,像設定 timeout 時間等。URLSessionConfiguration.background,則會在背景狀態去完成任務,可以用來做大檔案的處理。URLSessionConfiguration.ephemeral 則只會記錄在記憶體中,app 關閉後所有內容都會消失。

另外還有 URLSession.shared.webSocketTask,可以讓 app 和 server 之間創建長時間的通訊,可以發送的訊息種類包含 string 和 data (binary message)。


let url = URL(string: "wss://websocket.com/session/1")!
let webSocketTask = URLSession.shared.webSocketTask(with: url)

webSocketTask.resume()  // 啟動 websocket 連接

let nesMsg = URLSessionWebSocketTask.Message.string("start websocket")
webSocketTask.send(newMsg) { error in
    if let error = error {
        // ...
    } else {
        // ...
    }
}

func receiveMsg() {
    webSocketTask.receive { result in
        switch result {
        case .success(let message):
            switch message {
                case .string(let text):
                    print("Received string: \(text)")
                case .data(let data):
                    print("Received data: \(data)")
            }
            receiveMessage()
        case .failure(let error):
            print("Failed to receive message: \(error)")
        }
    }
}

receiveMsg()

上一篇
[Day25] 買隊服是充值信仰還是盤子
下一篇
[Day27] 修螢幕好貴要不要組桌機
系列文
自己的 app 自己寫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言