在类函数中调用 Alamofire 时出错
Posted
技术标签:
【中文标题】在类函数中调用 Alamofire 时出错【英文标题】:Getting an error when calling the Alamofire in a class function 【发布时间】:2021-12-02 01:35:28 【问题描述】:我正在使用 Alamofire 获取数据。URLRequestConvertible 协议用于构建请求。当通过 Alamofire 在请求的类函数中调用 URLRequestConvertible 枚举时,我收到一个错误,例如(来自类型的抛出函数的无效转换'( AFDataResponse) throws -> Void' (aka '(DataResponse) throws -> ()') 到非抛出函数类型 '(AFDataResponse) -> Void' (aka '(DataResponse) ->()'))。在我获取结果的请求函数中,我如何使用泛型? Q1:获取结果时出现错误 Q2:如何在函数中使用泛型
URLRequestConvertible 枚举:
enum Router: URLRequestConvertible
case getAllDishes
var bseUrl : URL
return URL(string: "https://yummie.glitch.me/")!
var method: HTTPMethod
switch self
default:
return .get
var path:String
switch self
case .getAllDishes:
return "dish-categories"
func asURLRequest() throws -> URLRequest
let url = bseUrl.appendingPathComponent(path)
var request = URLRequest(url: url)
request.method = method
return request
调用请求的函数:
class NetworkLayer
class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void)
ProgressHUD.show() //if response comes that loader run
AF.request(request).responseJSON (response) in
switch response.result
case .success(let data):
do
let getDishesData = data as? [String:Any]
let resp = try JSONSerialization.data(withJSONObject: getDishesData?["data"], options: .prettyPrinted)
completion(.success(response))
case .failure(let error):
completion(.failure(error))
【问题讨论】:
有do
但没有catch
?这就是它失败的原因。猜测是block可以throw
报错。
responseJSON
已经为你序列化了响应Data
,不需要自己做。只需访问序列化对象或使用responseDecodable
获取真正的响应类型。
【参考方案1】:
您需要添加 Do-Catch 语句
catch – 如果 throwing 方法失败并引发错误,则执行将落入此 catch 块。
class NetworkLayer
class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void)
ProgressHUD.show() //if response comes that loader run
AF.request(request).responseJSON (response) in
switch response.result
case .success(let data):
do
let getDishesData = data as? [String:Any]
let resp = try JSONSerialization.data(withJSONObject: getDishesData?["data"], options: .prettyPrinted)
completion(.success(response))
catch
print(error)
completion(.failure(error))
case .failure(let error):
completion(.failure(error))
这里给你的另一个建议是不需要做 JSONSerialization,因为 responseJSON 会给你直接的响应(Alamofire 会做 JSONSerialization)。
最终代码
class NetworkLayer
class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void)
ProgressHUD.show() //if response comes that loader run
AF.request(request).responseJSON (response) in
switch response.result
case .success(let response):
do
print(response)
completion(.success(response))
catch
print(error)
completion(.failure(error))
case .failure(let error):
completion(.failure(error))
【讨论】:
print(error.localizedDescription)
:不要那样做。不要使用localizedDescription
,使用print(error)
。另外,您可能还想致电completion()
...也许completion(.failure(error))
。
是的,真的更新了!谢谢。
您好 Abdul,如果您有任何问题,请告诉我,如果它有效,请接受此答案,以便对其他人也有帮助。
@Yogesh Patel 你是对的。以上是关于在类函数中调用 Alamofire 时出错的主要内容,如果未能解决你的问题,请参考以下文章