我想为响应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/),但它不起作用。
感谢。
答案 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
}
}