如何在Swift中观察API请求状态的变化?

问题描述 投票:0回答:1

我正在开发一个项目,并且正在向项目中的 API URL 发送 GET 请求。 (如下)

实际上这里的一切都适合我。但问题是;当我第一次发送请求时,“状态”值显示为 -proceeding-。过了一会儿就变成-完成了-。 (因为我正在等待 API 中的渲染)

我的问题是;我如何知道此状态值何时从进行中更改为已完成?因为我想在完成后做一个不同的动作。有什么想法吗?

    func fetchURL(url: String) {
    
    let apiUrl = URL(string: url)!

    let session = URLSession.shared

    let task = session.dataTask(with: apiUrl) { (data, response, error) in
        
        if let error = error {
            print("DEBUG: - Error: \(error)")
            return
        }
        guard let data = data else {
            print("DEBUG: - No data received")
            return
        }

        do {
            
            let decoder = JSONDecoder()
            let dustResponse = try decoder.decode(FetchData.self, from: data)
            
            print("DEBUG: - Status: \(dustResponse.detail.status)")
            print("DEBUG: - Message: \(dustResponse.detail.message)")
        } catch {
            print("DEBUG: - Error decoding JSON: \(error)")
        }
    }
    task.resume()
    
}
swift callback request observers
1个回答
0
投票

由于该过程是由 API 的服务器执行的,因此您无法真正知道它何时完成。我建议您看看是否有办法在处理完成时通知某种网络套接字。如果不这样做,您可以每 x 秒请求一次状态以查看处理是否完成:

@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
func APIFetchResult(apiUrl: URL) async -> FetchData? {
    return await withCheckedContinuation({ (result: CheckedContinuation<Continuation?, Never>) in
       let session = URLSession.shared

       let task = session.dataTask(with: apiUrl) { (data, response, error) in
           if let error = error {
              print("DEBUG: - Error: \(error)")
              result.resume(returning: nil)
           }
           guard let data = data else {
              print("DEBUG: - No data received")
              result.resume(returning: nil)
           }

           do {  
              let decoder = JSONDecoder()
              let dustResponse = try decoder.decode(FetchData.self, from: data)
            
              print("DEBUG: - Status: \(dustResponse.detail.status)")
              print("DEBUG: - Message: \(dustResponse.detail.message)")
              result.resume(returning: dustResponse)
           } catch {
              print("DEBUG: - Error decoding JSON: \(error)")
              result.resume(returning: nil)
           }
       }
       task.resume() 
    })
}


let finalResult: FinalResultType? = nil

while finalResult == nil {
    finalResult = await APIFetchResult(apiUrl: apiUrl)
    await Task.sleep(5_000_000_000) // wait 5 seconds before re-doing the request
}

// do whatever you want after

在这段代码中我们:

  1. 使用 Swift 标准库的本机
    fetchURL
    函数创建
    withCheckedContinuation
    函数的等待/异步版本。
  2. 每五秒 + 执行时间调用一次,直到定义
    finalResult

希望这对您有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.