在类函数中调用 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire 从 API 获取数据时出错

在类库中使用 WCF 服务时出错

在类的函数中创建字符串时出错

依次调用两个Alamofire函数

尝试在类定义中声明数组时出错

Xcode:Alamofire 源代码中的 Swift Dropbox 错误