iOS Synchronous HTTP Request

Photo by boris misevic on Unsplash
Photo by boris misevic on Unsplash
HTTP Request 一般都是非同步 (Asynchronous) 處理的。URLSession 和 Alamofire 都沒有提供同步處理的方法。既然它們只提供非同步的方法,那就只能將非同步的方法包裝成同步的方法。關鍵就在於,利用信號 (Semaphore) 來等待 HTTP Request 回來。

HTTP Request 一般都是非同步 (Asynchronous) 處理的。但有時候必須要同步 (Synchronous) 處理時,發現 URLSession 和 Alamofire 都沒有提供同步處理的方法。

既然它們只提供非同步的方法,那就只能將非同步的方法包裝成同步的方法。關鍵就在於,利用信號 (Semaphore) 來等待 HTTP Request 回來。

func syncRequest(_ url: String, method: Method) -> (Data?, Error?) {
    var data: Data?
    var error: Error?

    let url = URL(string: url)!
    var request = URLRequest(url: url)
    request.httpMethod = method.rawValue

    let semaphore = DispatchSemaphore(value: 0)

    let dataTask = URLSession.shared.dataTask(with: request) {
        data = $0
        error = $2

        semaphore.signal()
    }
    dataTask.resume()

    _ = semaphore.wait(timeout: .distantFuture)

    return (data, error)
}
發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like
Photo by Alex Alvarez on Unsplash
Read More

Dispatch Queue 教學

GCD 提供有效率的並行處理,讓我們不需要直接管理多執行緒。它的 Dispatch Queues 可以循序地(serially)或是並行地(concurrently)執行任務。我們只需要將要並行的程式當作任務提交到 dispatch queues 就可以了。
Read More
Photo by Florinel Gorgan on Unsplash
Read More

如何製作一個 XCFramework

XCFramework 讓你可以將 iPhone、iPhone 模擬器等多的不同平台的二進位碼打包到一個可發佈的 .xcframework 檔。你只需要為你的 Framework 產生出一個 .xcframework 檔,就可以支援多種平台。
Read More
Photo by Fabian Gieske on Unsplash
Read More

SwiftUI @State & @Binding 教學

SwiftUI 推出了兩個 Property Wrapper – @State and @Binding。利用它們可以達到變數的 Two-way Binding 功能。也就是當變數的值改變時,它會重新被顯示。本章藉由製作一個 Custom View 來展示如何使用 @State 和 @Binding。
Read More
Photo by Svitlana on Unsplash
Read More

iOS:禁止螢幕截圖

基於一些理由,我們可能會想要禁止使用者對我們的 app 做螢幕截圖。然而,iOS 並沒有提供這樣的功能。所幸,我們可以利用 UITextField 來達到此效果。
Read More