Невозможно вызвать запрос Alamofire, используя обещание - PullRequest
0 голосов
/ 14 декабря 2018

Я создал простой клиент для связи с моим API - вот одна из функций, которая работает:

static func makeCustomerLoginRequest(userName: String, password: String) -> Promise<CustomerLoginResponse>
{
    let requestObject = CustomerLoginRequest(CompanyToken: "XXXX", customerName: userName, customerPass: password)
    return Promise
        { seal in
            Alamofire.request(ApiProvider.buildUrl(), method: .post, parameters: requestObject.toXML(), encoding: XMLEncoding.default, headers: Constants.Header)
                     .responseXMLObject { (resp: DataResponse<CustomerLoginResponse>) in
                if let error =  resp.error
                {
                    seal.reject(error)
                }
                guard let Xml = resp.result.value else {
                    return seal.reject(ApiError.credentialError)
                }
                seal.fulfill(Xml)
            }
    }
}

Первое, что я заметил, выбрав такой подход, будет много повторения кода, и я быЯ хотел бы устранить это, однако попытка удалить часть общего кода, похоже, расстроила Alamofire.Вот мой измененный подход: во-первых, универсальный метод (находится в ApiProvider классе):

static func buildDataRequest(requestObject: XMLMappable) -> Promise<DataRequest>
{
    return Promise
    { seal in
        seal.fulfill(Alamofire.request(buildUrl(), method: .post, parameters: requestObject.toXML(), encoding: XMLEncoding.default, headers: Constants.Header))
    }
}

Далее следует новый makeCustomerLoginRequest метод:

static func makeCustomerLoginRequest(userName: String, password: String) -> CustomerLoginResponse
{
    let requestObject = CustomerLoginRequest(CompanyToken: “XXXXX”, customerName: userName, customerPass: password)
    ApiProvider.buildDataRequest(requestObject: requestObject).then {
        $0.responseXMLObject(completionHandler: { (resp:DataResponse<CustomerLoginResponse>) in

        })
    }
}

Выполнение этогооднако я получил следующую ошибку: Cannot invoke 'responseXMLObject' with an argument list of type '(completionHandler: (DataResponse<CustomerLoginResponse>) -> ())'

...