我有一个应用程序,它向我的服务器发送了一个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()
}