快速链关闭

时间:2017-10-03 08:41:23

标签: ios swift alamofire

我想为响应alamofire请求创建链闭包。

我有一个这样的课程:

 class Login {

        static let shared = Login()

        func getGuestToken() {

            Alamofire.request(AlamoRouter.Token()).validate().responseObject { (response: DataResponse<TokenModel>) in
                let errorMessage = "General error"
                switch response.result {
                case .success(_):
                    let token = response.result.value

                case .failure(_):
                    if let data = response.data {
                        let responseData = String(data: data, encoding: String.Encoding.utf8)
                        print(responseData ?? "test")
                    }
                }

            }

        }

    }

在viewController类中,我想做出这样的请求:

Login.shared.getGuestToken()。onSuccess {model in} .onError {error。 in}

我该怎么做?我试过很多方式(比如https://owensd.io/2015/02/20/handling-multiple-closure-parameters/),但它不起作用。

感谢。

2 个答案:

答案 0 :(得分:1)

将您的方法修改为

class Login {

    static let shared = Login()

    func getGuestToken(onSuccess : ((String) -> ()), onError: ((Error) -> ())) {

        Alamofire.request(AlamoRouter.Token()).validate().responseObject { (response: DataResponse<TokenModel>) in
            let errorMessage = "General error"
            switch response.result {
            case .success(_):
                let token = response.result.value
                onSuccess(token)

            case .failure(error):
                if let data = response.data {
                    let responseData = String(data: data, encoding: String.Encoding.utf8)
                    print(responseData ?? "test")
                    onError(error)
                }
            }

        }

    }

}

答案 1 :(得分:0)

以下是使用Login.shared.getGuestToken()?.onSuccess { model in }?.onError{ error . in }的方法:

protocol ErrorProtocol {
    func onError(completion: (Error?) -> ())
}

protocol SuccessProtocol {
    func onSuccess(completion: (String?) -> ()) -> ErrorProtocol?
}

class Test: SuccessProtocol, ErrorProtocol {
    var model: String?
    var error: Error?

    required init(model: String?, error: Error?) {
        self.model = model
        self.error = error
    }

    func onSuccess(completion: (String?) -> ()) -> ErrorProtocol? {
        if model != nil {
            completion(model)
        }
        return self
    }

    func onError(completion: (Error?) -> ()) {
        completion(error)
    }
}

class Login {

    static let shared = Login()

    func getGuestToken() -> SuccessProtocol? {

        var test: Test?
        let semaphore = DispatchSemaphore(value: 0)

        Alamofire.request(AlamoRouter.Token()).validate().responseObject { (response: DataResponse<TokenModel>) in
            let errorMessage = "General error"
            switch response.result {
            case .success(_):
                let token = response.result.value
                test = Test(model: token, error: nil)

            case .failure(error):
                if let data = response.data {
                    let responseData = String(data: data, encoding: String.Encoding.utf8)
                    print(responseData ?? "test")
                    test = Test(model: nil, error: error)
                }
            }
            semaphore.signal()
        }

        _ = semaphore.wait(timeout: .distantFuture)
        return test
    }
}