У меня есть приложение, которое отправляет запрос 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()
}
}
Но NSURLConnection.sendAsynchronousRequest устарела в iOS9, и мне нужно переключиться на NSURLSession.sharedSession (). DataTaskWithRequest. После реализации NSURLSession.sharedSession (). DataTaskWithRequest ответ моего Сервера показывается через 20 секунд, что определенно долго. Я даже вижу, что моя переменная сразу заполняется правильным ответом, но табличное представление не показывает это сразу, что здесь не так?
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
является асинхронной операцией, она выполняется в фоновом потоке. И все операции пользовательского интерфейса должны выполняться в главном потоке. Когда вы получаете обратный звонок от NSURLSession.sharedSession().dataTaskWithRequest
вы все еще в фоновом потоке. Следовательно, вам необходимо выполнить перезагрузку табличного представления из основного потока. Используйте следующий код, чтобы сделать это
dispatch_async(dispatch_get_main_queue()) {
self.answer = c
self.tableView.reloadData()
}
Вы должны обновить свой интерфейс в главном потоке
dispatch_async(dispatch_get_main_queue()) {
self.answer = c
self.tableView.reloadData()
}