如何从服务器 运行 AsyncTask 到 return 响应,然后转到下一个视图控制器

How to run AsyncTask to return response from server, then segue to next view controller

在收到以下代码的响应后,我可以转到下一个视图控制器,但这需要大约 10 秒。 print(result) 在不到一秒的时间内打印出响应,但 segue 需要 10 秒。如果我将 segue 放在 getResponse 函数下,segue 和 print(result) 行将在一秒钟内 运行 但我尝试使用 checkit 字符串在下一个视图控制器上更新的标签不会更新加载下一个视图控制器时的标签。

函数:

func getResponse(urrl: String, completion: @escaping (String) -> ()) {
        let url = URL(string: urrl)!

        URLSession.shared.dataTask(with:url) { (data, response, error) in
            if error != nil {
                print(error!)
                completion("")
            } else {
                if let returnData = String(data: data!, encoding: .utf8) {
                    completion(returnData)


                } else {
                    completion("")
                }
            }
            }.resume()
    }

调用函数并继续:

getResponse(urrl:finalurl) { result in
                        print(result)
                        checkit = result
                        self.performSegue(withIdentifier: "responsesegue", sender:self)
                }

下一个视图控制器:

class WebResponse: UIViewController {

@IBOutlet weak var responseMessage: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    print(checkit + " Next Spot") //just posts the default checkit value
    responseMessage.text = checkit

}



}

更新:

调用函数和转场:

getResponse(urrl:finalurl) { result in
                        print(result)
                        var message = result.components(separatedBy: "\"")
                        print(message[5])
                        self.holdon = message[5]
                        //self.performSegue(withIdentifier: "responsesegue", sender:self)
                }


                func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                    if let destinationViewController = segue.destination as? WebResponse {
                        destinationViewController.checkit  = self.holdon
                    }
                }

网络响应:

import UIKit

class WebResponse: UIViewController {
    var checkit = "l"
    @IBOutlet weak var responseMessage: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        print(checkit + " Next Spot")
        //var ccheckit = "Testttttting"
        responseMessage.text = checkit

        // Do any additional setup after loading the view.
    }



}

我在第一个视图控制器中定义 holdon 的位置与在第二个视图控制器中定义 checkit 的位置相同

self.performSegue(withIdentifier: "responsesegue", sender:self) 放在 getResponse 下是正确的。要传递数据,需要这样实现prepareForSegue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationViewController = segue.destination as? WebResponse {
        destinationViewController.checkit  = self.checkit
    }
}

像这样在主队列中调用完成块:

func getResponse(urrl: String, completion: @escaping (String) -> ()) {
        let url = URL(string: urrl)!

        URLSession.shared.dataTask(with:url) { (data, response, error) in
            if error != nil {
                print(error!)
               DispatchQueue.main.async{
                completion("")
               }
            } else {
                if let returnData = String(data: data!, encoding: .utf8) {
                    DispatchQueue.main.async{
                      completion(returnData)
                    }
                } else {
                    DispatchQueue.main.async{
                      completion("")
                    }
                }
            }
            }.resume()
    }

当您调用函数时在主队列中执行 segue

getResponse(urrl:finalurl) { result in
     DispatchQueue.main.async{
       print(result)
       checkit = result
       self.performSegue(withIdentifier: "responsesegue", sender:self)      
    }

}