程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.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之间传递的对象):?

开发过程中遇到如何从方法中返回 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之间传递的对象):的解决方法建议,希望对你解决如何从方法中返回 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(我期待请求的结果但总是返回 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)
    }
}

类 LoginhttpRequestWorker

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(代表POST请求体的参数):

struct UserParameters: encodable {
    let user: String
    let password: String
}

Struct UserData(代表来自 JsON 响应的数据):

struct UserData: Decodable {
    // some var declarations such as ID,name etc
}

Enum Login(代表VIEwController、Interactor和Presenter之间传递的对象):

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,请注明来意。
标签: