自定义序列化在 Alamofire 4.0 中发现不正确的“响应”

Posted

技术标签:

【中文标题】自定义序列化在 Alamofire 4.0 中发现不正确的“响应”【英文标题】:Custom Serialization finds incorrect "response" in Alamofire 4.0 【发布时间】:2016-09-26 21:31:18 【问题描述】:

我正在尝试为 Alamofire 4.0 定义自定义模型序列化。到目前为止,我正在关注responseJson 和朋友们提出的模型。具体来说,我到目前为止是:

extension Alamofire.Request 
    public static func serializeResponseModel<T:ModelObject>(response:HTTPURLResponse?, data:Data?, error:Error?) -> Alamofire.Result<T> 
        switch serializeResponseJSON(options: [], response: response, data: data, error: error) 
        case .success(let jsonObject):
            do 
                return .success(try T(json:jsonObject as! JSONObject))
            
            catch 
                return .failure(error)
            
        case .failure(let error):
            return .failure(error)
        
    


extension Alamofire.DataRequest 
    public static func serializeResponseModel<T:ModelObject>() -> DataResponseSerializer<T> 
        return DataResponseSerializer  _, response, data, error in
            return Request.serializeResponseConcierge(response: response, data: data, error: error)
        
    

    @discardableResult
    public func responseModel<T:ModelObject>(queue: DispatchQueue? = nil, completionHandler: @escaping (DataResponse<T>) -> Void) -> Self
    
        return response(
            queue: queue,
            responseSerializer: DataRequest.serializeResponseModel(),
            completionHandler: completionHandler
        )
    

不幸的是,该框架的实现有些糟糕,return response( 行正在寻找response 属性(在Request 中定义)而不是适当的response 方法(在DataRequest 中定义),这导致编译错误:

Cannot call value of non-function type 'HTTPURLResponse?'

我在这里遗漏了什么,使它可以在 responseJson 的情况下工作,但不适用于我的情况?

【问题讨论】:

【参考方案1】:

显然问题是由于过度概括,编译器无法为DataRequest.serializeResponseModel() 生成适当的类型当我将responseModel 更改为以下并指定适当的类型时,事情按预期工作:

@discardableResult
public func responseModel<T:ModelObject>(queue: DispatchQueue? = nil, completionHandler: @escaping (DataResponse<T>) -> Void) -> Self

    return response(
        queue: queue,
        responseSerializer: DataRequest.modelResponseSerializer() as DataResponseSerializer<T>,
        completionHandler: completionHandler
    )

【讨论】:

以上是关于自定义序列化在 Alamofire 4.0 中发现不正确的“响应”的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 4.0 路由器表达式类型不明确,没有更多上下文

如何使用 Alamofire 4.0 获取 JSON 字典/数组并将其显示在 tableView Cell 上

在 Alamofire 4.0 中初始化 SessionManager

如何在 alamofire 中使用自定义动词?

包装在静态函数中时,Alamofire 4.0“调用中的额外参数'方法'”

我的旧项目将 Alamofire 更新到 4.0 版时遇到错误