Search code examples
iosalamofireswift3

Alamofire 3->4 trouble with Reponse & ResponseSerializer Swift 3.0


I'm having trouble with the ResponseSerializer I get an unresolved identifier and for Response I get an undeclared type. I've read from alamofire migration doc that Response has been changed to multiple types. So I should change Response->DataReponse but this means I can only pass one argument like:

// What I have
Response(<ListWrapper, NSError>)

// What I should change it to?
DataResponse(<ListWrapper>)

How can I still recieve the Error this way and more importantly how do I migrate the extension to alamofire 4?

My class:

class List{

    var idNumber: String?
    var title: String?
    var posterPath: String?
    var release: String?

    required init(json: JSON, id: Int?) 
    {
        self.idNumber = json[ListFields.Id.rawValue].stringValue
        self.title = json[ListFields.Title.rawValue].stringValue
        self.posterPath = json[ListFields.PosterPath.rawValue].stringValue
        self.release = json[ListFields.Release.rawValue].stringValue
    }

    class func setURL_APPEND(_ url: String)
    {
        URL_APPEND  = url
    }

    // MARK: Endpoints
    class func endpointForList() -> String 
    {
        return URL_APPEND
    }


    fileprivate class func getListAtPath(_ path: String, completionHandler: @escaping (ListWrapper?, NSError?) -> Void) {
        Alamofire.request(path)
            .responseListArray { response in

                if let error = response.result.error
                {
                    completionHandler(nil, error)
                    return
                }
                completionHandler(response.result.value, nil)
        }
    }

    class func getList(_ completionHandler: @escaping (ListWrapper?, NSError?) -> Void) 
    {
        getListAtPath(List.endpointForList(), completionHandler: completionHandler)
    }


}
// Problem is here:
// for ResponseSerializer I get an unresolved identifier 
// and for Response I get an undeclared type
extension Alamofire.Request {
    func responseListArray(_ completionHandler: @escaping (Response<ListWrapper, NSError>) -> Void) -> Self {
        let responseSerializer = ResponseSerializer<ListWrapper, NSError> { request, response, data, error in

            guard error == nil else 
            {
                return .failure(error!)
            }
            guard let responseData = data else {
                let failureReason = "Array could not be serialized because input data was nil."
                let error = Alamofire.Error.errorWithCode(.dataSerializationFailed, failureReason: failureReason)
                return .failure(error)
            }

            let JSONResponseSerializer = Request.JSONResponseSerializer(options: .allowFragments)
            let result = JSONResponseSerializer.serializeResponse(request, response, responseData, error)

            switch result {
            case .success(let value):
                let json = SwiftyJSON3.JSON(value)
                let wrapper = ListWrapper()

                var allList:Array = Array<List>()

                wrapper.totalCount = json["favorite_count"].intValue

                // print(json)
                let results = json["items"]
                // print(results)
                for jsonList in results
                {
                    //print(jsonList.1)

                    let list = List(json: jsonList.1, id: Int(jsonList.0) )
                    if (list.posterPath == "")
                    {
                        continue
                    }
                    else
                    {
                        //print(movies.posterPath)
                        allList.append(list)
                    }

                }
                wrapper.results = allList
                return .success(wrapper)
            case .failure(let error):
                return .failure(error)
            }
        }

        return response(responseSerializer: responseSerializer,completionHandler: completionHandler)
    }
}

Solution

  • Bro try below code see:

    func responseListArray(_ completionHandler: @escaping (Response<ListWrapper>) -> Void) -> Self {
        let responseSerializer = ResponseSerializer<ListWrapper> { request, response, data, error in
    
            guard error == nil else 
            {
                return .failure(error!)
            }
            guard let responseData = data else {
                 return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))
    
            }
    
            let JSONResponseSerializer = Request.JSONResponseSerializer(options: .allowFragments)
            let result = JSONResponseSerializer.serializeResponse(request, response, responseData, error)
    
            switch result {
            case .success(let value):
                let json = SwiftyJSON3.JSON(value)
                let wrapper = ListWrapper()
    
                var allList:Array = Array<List>()
    
                wrapper.totalCount = json["favorite_count"].intValue
    
                // print(json)
                let results = json["items"]
                // print(results)
                for jsonList in results
                {
                    //print(jsonList.1)
    
                    let list = List(json: jsonList.1, id: Int(jsonList.0) )
                    if (list.posterPath == "")
                    {
                        continue
                    }
                    else
                    {
                        //print(movies.posterPath)
                        allList.append(list)
                    }
    
                }
                wrapper.results = allList
                return .success(wrapper)
            case .failure(let error):
                return .failure(error)
            }
        }
    
        return response(responseSerializer: responseSerializer,completionHandler: completionHandler)
    }