我有一个应用程序,它向我的服务器发送了一个php POST请求,应该立即得到答复。
使用我的“旧”功能,通常的行为是我打开应用程序,并在显示视图时可以看到答案。

var answer:String = "" //global
func getAnswer() {
    let URL:NSURL = NSURL(string:"https://someurl.com/index.php")!
    let request:NSMutableURLRequest = NSMutableURLRequest(URL: URL)
    let postString = "some=POSTMESSAGE"
    request.HTTPMethod = "POST"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
        (response,data,error) in
        self.answer = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String
        self.tableView.reloadData()
    }
}


但是iOS9中不推荐使用NSURLConnection.sendAsynchronousRequest,我需要切换到NSURLSession.sharedSession()。dataTaskWithRequest。在实现NSURLSession.sharedSession()。dataTaskWithRequest之后,我的服务器的答案将在20秒后显示,这肯定很长。我什至可以看到我的变量立即被正确的Answer填充,但是tableview不能立即显示它,这怎么了?

var answer:String = "" // global
func getAnswer() {
    let URL:NSURL = NSURL(string:"https://https://someurl.com/index.php")!
    let request:NSMutableURLRequest = NSMutableURLRequest(URL: URL)
    let postString = "some=POSTMESSAGE"
    request.HTTPMethod = "POST"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
        let c = NSString(data: data!, encoding: 4) as! String
        self.answer = c
        self.tableView.reloadData()
        })
    task.resume()
}

最佳答案

由于NSURLSession.sharedSession().dataTaskWithRequest是异步操作,因此它在后台线程上执行。并且所有UI操作必须在主线程上执行。当您收到来自NSURLSession.sharedSession().dataTaskWithRequest的回调时,您仍在后台线程中。因此,您需要从主线程重新加载表视图。使用以下代码来做到这一点

dispatch_async(dispatch_get_main_queue()) {
     self.answer = c
     self.tableView.reloadData()
}

10-01 05:10