wxsxtat 2022-01-26 21:33 采纳率: 0%
浏览 29

swift写一个登录成功跳转页面的练习,遇到了异步返回与闭包函数无法取值做判断的问题

问题遇到的现象和发生背景

如下面代码,本意是通过用户密码认证之后在跳转页面,但是判断json返回数据只能在闭包中获取到变量值,而且闭包中无法进行页面跳转,想请教各位有什么其他方法,或者更好的思路吗?


override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        if identifier == "succses"{
            let netWorkToQc = NetWorkQc()
            if usernameText.text == "" || pwdText.text == "" || usernameText.text == nil || pwdText.text == nil{
                return false
            }
            let parameters: [String: Any] = [
                        "user" : usernameText.text,
                        "pwd": pwdText.text
            ]
            var userSts = 0
            netWorkToQc.getUrlFunc(urlStr:"http://192.168.50.91:8080",parametersArray:parameters,completion: { [weak self] (result, error) in
                if let error = error {
                    print(error.localizedDescription)
                }
                if let result = result {
                    userSts = result.sts
                }else{
                    userSts = 0
                }
            })
        }
        return true
    }



 func getUrlFunc(urlStr:String,parametersArray:[String:Any],completion:@escaping (_ data:ErrorResponse?, _ error:Error?) -> Void)
    {
        let Url = String(format: urlStr)
            guard let serviceUrl = URL(string: Url) else {return}
            let parameters: [String: Any] = parametersArray
            /*
            [
                "request": [
                        "xusercode" : "YOUR USERCODE HERE",
                        "xpassword": "YOUR PASSWORD HERE"
                ]
            ]*/
            var request = URLRequest(url: serviceUrl)
            request.httpMethod = "POST"
            request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
            guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else {return}
            request.httpBody = httpBody
            request.timeoutInterval = 20
            let session = URLSession.shared
            session.dataTask(with: request) { (data, response, error) in
                if(error != nil) {
                    completion(nil, error)
                }else
                {
                    if let data = data {
                        do {
                            let JsonBlackData = try? JSONDecoder().decode(ErrorResponse.self, from: data)
                            completion(JsonBlackData, nil)
                        } catch {
                            completion(nil, error)
                        }
                    }else{
                        completion(nil, nil)
                    }
                }
            }.resume()
    }
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 史前文物 2022-01-31 07:11
    关注

    为什么“闭包中无法进行页面跳转”? dataTask 运行在background thread中,“跳转页面”需要在UI(main)thread 中完成,所以你需要在闭包中Dispatch到主线程。

    ```
    ...
    userSts = result.sts
    DispatchQueue.main.async {
    // 跳转页面
    }

    ``` 页面跳转

    评论

报告相同问题?

问题事件

  • 创建了问题 1月26日