如何重试 URLRequest.sharedDataTask 直到响应为 200?

问题描述

我是 Swift 的新手,目前坚持在 httpResponse 为 200 时退出包含 shared.dataTask 的函数。任何建议将不胜感激。

func retryFunc(url: String,requestType: String,requestJsonData: Any,retriesLeft: Int) {
    //Function body
    // declarations
    while self.numberOfretries > 0 {
        let task = URLSession.shared.dataTask(with: request) { data,response,error in
            guard let data = data,error == nil else {
                print(error?.localizedDescription ?? "No data")
                return
            }            
            
            if let httpResponse = response as? HTTPURLResponse {
                print(httpResponse.statusCode)
                if httpResponse.statusCode == 200 {
                    print("Got 200")
                    self.numberOfretries = 0
                    let responseJSON = try? JSONSerialization.jsonObject(with: data,options: [])
                    if let responseJSON = responseJSON as? [String: Any] {
                        print(responseJSON)
                    }
                    return
                }
                if httpResponse.statusCode == 500 {
                    print("Got 500")
                    self.numberOfretries -= 1
                    
                    self.retryFunc(url: url,requestType: <request-type>,requestJsonData: json,retriesLeft: self.numberOfretries)
                }
            }
        }
        task.resume()
    }
}
//calling function from another class
func retryFunc(url: <url>,requestType: <type>,requestJsonData: <jsonData>,retriesLeft: <3>)

我需要在获得 200 时退出函数,但它仍然继续运行调用函数时指定的重试次数。

解决方法

考虑到 while 循环在异步任务之外,因此在计数器递减之前可以创建几个 100 个任务。

更好的方法是移除 while 循环并检查闭包内是否为 0 - retriesLeft 参数没有意义 - 例如

func retryFunc(url: String,requestType: String,requestJsonData: Any) {
    //Function body
    // declarations
    
    let task = URLSession.shared.dataTask(with: request) { data,response,error in
                        
        if let error = error {
            print(error.localizedDescription)
            return
        }
                            
        if let httpResponse = response as? HTTPURLResponse {
           print(httpResponse.statusCode)
           if httpResponse.statusCode == 200 {
               print("Got 200")
               do {
                   if let responseJSON = try JSONSerialization.jsonObject(with: data!) as? [String: Any] {
                       print(responseJSON)
                   }
               } catch { print(error) }

           } else if httpResponse.statusCode == 500 {
               print("Got 500")
               self.numberOfretries -= 1
               if self.numberOfretries == 0 { return }
    
               self.retryFunc(url: url,requestType: requestType,requestJsonData: requestJsonData)
           }
       }
    }
    task.resume()
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...