大佬教程收集整理的这篇文章主要介绍了如何从方法中返回 Alamofire POST 请求的结果而不为零? Class LoginInteractor(我期待请求的结果但总是返回 nil):类 LoginHTTPRequestWorker:Struct UserParameters(代表POST请求体的参数):Struct UserData(代表来自 JSON 响应的数据):Enum Login(代表ViewController、Interactor和Presenter之间传递的对象):,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 UIKit-Storyboard 制作一个模拟登录屏幕的应用程序: 当用户输入登录数据(用户名和密码)然后点击登录按钮时,一个负责用Alamofire封装请求的类调用一个方法,其返回是 POST 请求的结果(我在这个项目中使用 Clean Swift Architecture,所以在这种情况下,Interactor 将此函数委托给一个 Worker 并返回一个对象)。
我的问题是我需要使用这个方法的返回值(POST请求的结果)在屏幕上显示一些数据。但是,由于 Alamofire 的请求是异步,该函数在请求填充对象之前返回nil。
我的课程是这样的:
class LoginInteractor: LoginBusinessLogic {
var httpRequestWorker: LoginhttpRequestWorker!
func applyBusinessLogic(request: Login.Login.Request) {
let user = User(username: request.fIElds.username,password: request.fIElds.password)
// (1)
if let userData = self.dologinInEndpoint(with: user) {
// NEVER FALLS HERE BECAUSE userData IS ALWAYS NIL
var userAccount: UserAccount?
var errorMessage: ErrorMessage?
if let _ = userData.userAccount.userID {
userAccount = UserAccount(extractedFrom: userData)
}
if let _ = userData.error.code {
errorMessage = ErrorMessage(extractedFrom: userData)
}
// Do some work with userData and delegates to presenter
....
}
}
// (2)
private func dologinInEndpoint(with user: User) -> UserData? {
httpRequestWorker = LoginhttpRequestWorker()
return httpRequestWorker.dologin(with: user)
}
}
class LoginhttpRequestWorker {
private let group = dispatchGroup()
// (3)
func dologin(with user: User) -> UserData? {
var userData: UserData?
makeRequest(with: user) { data in
userData = data
print(userData)
self.group.leave()
}
return userData
}
// (4)
private func makeRequest(with user: User,completion: @escaPing (UserData) -> ()) {
let endpoint = // "a string representing an endpoint"
let headers: httpheaders = [.ContentType("application/Json; charset=utf-8")]
let request = AF.request(endpoint,method: .post,parameters: UserParameters(user: user.username,password: user.password),encoder: JsONParameterEncoder.default,headers: headers)
group.enter()
request.responseDecodable(of: UserData.self) { response in
self.group.notify(queue: dispatchQueue.main) {
completion(response.value!)
}
}
}
}
struct UserParameters: encodable {
let user: String
let password: String
}
struct UserData: Decodable {
// some var declarations such as ID,name etc
}
enum Login {
struct LoginFIElds {
var username: String
var password: String
}
enum Login {
struct Request {
var fIElds: LoginFIElds
}
struct Response {
var user: UserAccount?
var error: ErrorMessage?
}
struct viewmodel {
var user: UserAccount?
var error: ErrorMessage?
}
}
}
有没有办法在 POST 请求结束后返回一个对象?或者有没有更好的方法来完成这项任务? 我在这里搜索,找到了一些解决方案,例如:使用 dispatchGroup.wait()、dispatchGroup.notify(queue: dispatchMain) 和使用闭包,但这些解决方案对我不起作用。
我提前道歉,因为我是 Swift 和 Stack Overflow 的新手,但如果有人至少能指出我的方向,我会很高兴。谢谢!
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
以上是大佬教程为你收集整理的如何从方法中返回 Alamofire POST 请求的结果而不为零? Class LoginInteractor(我期待请求的结果但总是返回 nil):类 LoginHTTPRequestWorker:Struct UserParameters(代表POST请求体的参数):Struct UserData(代表来自 JSON 响应的数据):Enum Login(代表ViewController、Interactor和Presenter之间传递的对象):全部内容,希望文章能够帮你解决如何从方法中返回 Alamofire POST 请求的结果而不为零? Class LoginInteractor(我期待请求的结果但总是返回 nil):类 LoginHTTPRequestWorker:Struct UserParameters(代表POST请求体的参数):Struct UserData(代表来自 JSON 响应的数据):Enum Login(代表ViewController、Interactor和Presenter之间传递的对象):所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。