我正在尝试为我的alamofire请求创建网络单例,以便为了调用我的API,我只需要执行以下操作:
Services.sharedInstance.useAlamo { (result: Array) in
case .success:
self.userarray = result
self.tableView.reloadData()
self.tableView.dataSource = self
print (result)
case .failure:
print ("Request Failed")
}
我设置了单例,可以通过结果,但不确定如何将枚举添加到完成块,以便在调用单例时可以使用.success或.failure。到目前为止,我尝试过这样的事情,但收到了错误:
enum Results<Value> {
case success(Value)
case failure(Error)
}
struct Services {
static let sharedInstance = Services()
func useAlamo(finished: @escaping (_ result: [User]) -> Results<String>) {
var userarray: [User] = []
Alamofire.request("https://jsonplaceholder.typicode.com/posts").validate().responseData { response in
switch response.result {
case .success:
if let data = response.result.value {
userarray = try! JSONDecoder().decode([User].self, from: data)
finished(userarray)
return .success("string") // Error here: "Type 'Void' has no member 'success'"
}
case .failure:
finished(userarray)
return .failure("stringfailure") // Error here: "Type 'Void' has no member 'failure'"
}
}
}
}
更新:目标是获得成功和未能从完成块调用的枚举。建议的重复问题与此无关。
答案 0 :(得分:1)
有很多问题。最重要的问题是您无法从异步完成处理程序返回值。
使用你的枚举声明useAlamo
函数没有返回值,但在闭包中传递Results
对象。成功通过User
数组后,如果失败则传递Error
。您必须添加适当的错误,Alamofire调用返回的错误或自己创建的错误。而不是return
语句调用finished
闭包。
代码未经测试,因为我不使用Alamofire。它将无法编译,因为缺少error
个对象。但是你会得到工作流程的印象
struct Services {
static let sharedInstance = Services()
func useAlamo(finished: @escaping (Results<[User]>) -> () ) {
Alamofire.request("https://jsonplaceholder.typicode.com/posts").validate().responseData { response in
switch response.result {
case .success:
if let data = response.result.value {
let userarray = try! JSONDecoder().decode([User].self, from: data)
finished(.success(userarray))
} else {
// create an error
finished(.failure(error))
}
case .failure:
finished(.failure(error))
}
}
}
}
在呼叫侧切换result
并处理相关值
var userarray = [User]()
Services.sharedInstance.useAlamo { result in
switch result {
case .success(let users):
self.userarray = users
self.tableView.reloadData()
print(users)
case .failure(let error):
print ("Request Failed", error)
}
}