无法在 Swift 中使用范围方法之外的变量(dataTaskWithRequest)

问题描述 投票:0回答:1
@IBOutlet var nameLabel : UILabel!
var finalString: String = "test"

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func helloWorldAction(nameTextField: UITextField) {


    //fetch data from server
    let request = NSMutableURLRequest(URL: NSURL(string: "http://192.168.1.11")!)
    request.HTTPMethod = "POST"
    let postString = "user=test&pass=test3"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        //error handeling
        if error != nil {
            println("error=\(error)")
            return
        }

        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        self.finalString = String(responseString!)
        println("\(self.finalString)");
    }
    task.resume()

    //print finalString
    println("finalString = \(finalString)")

}

}

我正在尝试做两件事,我会告诉你什么对这两件事都不起作用。

首先,在这段代码中没有看到,我试图为

UILabel.text
分配一个值,但这根本不起作用。我无法在函数内执行此操作,也无法在函数外执行此操作。这让我想到了第二个问题。当在函数内部打印 FinalString 时,它会输出正确的值。

但是,当它在函数外部打印时,它会打印第一次分配的值。请告诉我如何正确分配

UILabel.text
值以及如何在问题范围之外使用输出。 预先感谢。

ios swift asynchronous request dispatch
1个回答
3
投票
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var nameLabel: UITextField!
    // you have to add a completion block to your asyncronous request
    func fireRequest(link: String, completion: (Data?) -> Void) {
        if let requestUrl = URL(string: link) {
            var request = URLRequest(URL: requestUrl)
            request.httpMethod = "POST"
            let postString = "user=test&pass=test3"
            request.httpBody = Data(postString.utf8)
            URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data else {
                    print("error:", error ?? "nil")
                    completion(nil)
                    return
                }
                completion(data)
            }.resume()
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        print("Fired request:", + Date().description(with: .current)) 
        fireRequest("http://192.168.1.11") { data in
            DispatchQueue.main.async {
                print("Finished request")
                if let data,  // unwrap your data
                    let myResponseStr = String(data: data, encoding: .utf8) {      
                    self.nameLabel.text = myResponseStr
                    print("response:", myResponseStr)
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.