【问题标题】:Can't use variable outside of scope method in Swift (dataTaskWithRequest)不能在 Swift (dataTaskWithRequest) 中使用范围方法之外的变量
【发布时间】:2015-01-08 01:22:22
【问题描述】:
@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 值以及如何使用问题范围之外的输出。 提前致谢。

【问题讨论】:

  • 您在异步任务完成之前打印它
  • 您能详细说明一下吗?我认为任务在“task.resume()”之后完成。如果没有,那我该如何完成任务?
  • stackoverflow.com/a/27650412/2303865 看看这段代码。
  • task.resume 启动任务,但它立即返回,任务在后台运行。您需要使用闭包中检索到的数据执行您的操作。

标签: ios swift asynchronous request dispatch


【解决方案1】:
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: NSData?) -> Void)) {
        if let requestUrl = NSURL(string: link){
            let request = NSMutableURLRequest(URL: requestUrl)
            request.HTTPMethod = "POST"
            let postString = "user=test&pass=test3"
            request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
            NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) in
                    completion(data: NSData(data: data))
                    if let error = error {
                        println("error=\(error)")
                        return
                    }

                }.resume()
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
         println("Fired request" + NSDate().description )
        fireRequest("http://192.168.1.11") { data in
            dispatch_async(dispatch_get_main_queue()) {
                println("Finished request")
                if let data = data { // unwrap your data (!= nil)
                    let myResponseStr = NSString(data: data, encoding: NSUTF8StringEncoding) as String
                    self.nameLabel.text = myResponseStr
                    println("response:"+myResponseStr)
                }
            }
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2011-12-06
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多