在 URLSession.shared.dataTask 之后调用 performSegue
Call performSegue after URLSession.shared.dataTask
我想在使用 URLSession.shared.dataTask
发送 post 请求后执行 Segue
ViewController:
@IBAction func Connection(_ sender: AnyObject) {
let loginFunc = Login()
loginFunc.login(username: username.text!, password: password.text!) { jsonString in
let response = jsonString
print(response)
if response.range(of: "failure") == nil {
self.performSegue(withIdentifier: "home", sender: nil)
}
}
}
登录:
class Login {
// the completion closure signature is (String) -> ()
func login(username: String, password: String, completion: @escaping (String) -> ()) {
var request = URLRequest(url: URL(string: "http://myurl/web/app_dev.php/login_check")!)
request.httpMethod = "POST"
let postString = "_username=" + username + "&_password=" + password
request.httpBody = postString.data(using: .utf8)
var responseString = ""
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(error)")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
responseString = String(data: data, encoding: .utf8)!
completion(responseString)
}
task.resume()
}
}
它有时会因以下错误而崩溃:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.'
有更好的方法吗?
尝试这种方式:
if response.range(of: "failure") == nil {
NSOperationQueue.mainQueue().addOperationWithBlock {
self.performSegue(withIdentifier: "home", sender: nil)
}
}
swift3:
if response.range(of: "failure") == nil {
OperationQueue.main.addOperation {
self.performSegue(withIdentifier: "home", sender: nil)
}
}
正如错误所说,您需要像这样在主线程中调用 perform segue
DispatchQueue.main.async {
self.performSegue(withIdentifier: "home", sender: nil)
}
我想在使用 URLSession.shared.dataTask
发送 post 请求后执行 SegueViewController:
@IBAction func Connection(_ sender: AnyObject) {
let loginFunc = Login()
loginFunc.login(username: username.text!, password: password.text!) { jsonString in
let response = jsonString
print(response)
if response.range(of: "failure") == nil {
self.performSegue(withIdentifier: "home", sender: nil)
}
}
}
登录:
class Login {
// the completion closure signature is (String) -> ()
func login(username: String, password: String, completion: @escaping (String) -> ()) {
var request = URLRequest(url: URL(string: "http://myurl/web/app_dev.php/login_check")!)
request.httpMethod = "POST"
let postString = "_username=" + username + "&_password=" + password
request.httpBody = postString.data(using: .utf8)
var responseString = ""
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(error)")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
responseString = String(data: data, encoding: .utf8)!
completion(responseString)
}
task.resume()
}
}
它有时会因以下错误而崩溃:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.'
有更好的方法吗?
尝试这种方式:
if response.range(of: "failure") == nil {
NSOperationQueue.mainQueue().addOperationWithBlock {
self.performSegue(withIdentifier: "home", sender: nil)
}
}
swift3:
if response.range(of: "failure") == nil {
OperationQueue.main.addOperation {
self.performSegue(withIdentifier: "home", sender: nil)
}
}
正如错误所说,您需要像这样在主线程中调用 perform segue
DispatchQueue.main.async {
self.performSegue(withIdentifier: "home", sender: nil)
}