Tidak dapat menggunakan variabel di luar metode cakupan di Swift (dataTaskWithRequest)

@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)")

}

}

Saya mencoba melakukan dua hal, dan saya akan memberi tahu Anda apa yang tidak berhasil pada keduanya.

Pertama, tidak terlihat dalam kode ini, saya mencoba memberikan nilai UILabel.text a, itu tidak berhasil sama sekali. Saya tidak bisa melakukannya di dalam fungsi dan saya juga tidak bisa melakukannya di luar. Ini membawa saya ke masalah nomor dua. Ketika finalString dicetak di dalam fungsi, ia akan menghasilkan nilai yang sesuai.

Namun, ketika dicetak di luar fungsi, ia akan mencetak nilai yang pertama kali ditetapkan. Tolong beri tahu saya cara menetapkan nilai UILabel.text dengan benar dan cara menggunakan output di luar cakupan pertanyaan. Terima kasih sebelumnya.


person AngleSideSide    schedule 08.01.2015    source sumber
comment
Anda mencetaknya sebelum tugas asinkron selesai   -  person Leo Dabus    schedule 08.01.2015
comment
bisakah Anda menjelaskannya lebih lanjut? Saya pikir tugas selesai setelah 'task.resume()'. jika tidak, lalu bagaimana cara menyelesaikan tugas tersebut?   -  person AngleSideSide    schedule 08.01.2015
comment
stackoverflow.com/a/27650412/2303865 Lihat kode ini.   -  person Leo Dabus    schedule 08.01.2015
comment
task.resume memulai tugas tetapi segera kembali dengan tugas berjalan di latar belakang. Anda perlu melakukan tindakan Anda dengan data yang diambil di penutupan.   -  person Paulw11    schedule 08.01.2015