0

我正在尝试使用 Alamofire 5 对后端进行登录调用。问题是当我进行调用时,我需要一个值来返回控制器以验证凭据。

所以,问题是 Alamofire 只进行异步调用,所以我需要使其同步。我看到了一个使用信号量的解决方案,但我不知道如何实现它。

这是我找到的解决方案:

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)
}

而且,这是我的请求代码:

AF.request(request)
        .uploadProgress { progress in
            
        }
        .response(responseSerializer: serializer) { response in
            if response.error == nil {
                if response.data != nil {
                    do {
                        try decoder.decode(LogInSuccessful.self, from: response.data!)
                        
                    } catch {
                        do {
                            try decoder.decode(LogInError.self, from: response.data!)
                            
                        } catch {
                            
                        }
                    }
                }
                statusCode = response.response!.statusCode
            }
        }
4

0 回答 0