【发布时间】:2015-11-03 02:00:35
【问题描述】:
任何帮助都将不胜感激,我有一堆用于调用 NSURLConnection Synchronous 方法的类,但不再存在。如何以在继续前等待响应的方式调用此代码块?
class func login(email:String,password:String)->Int{
var userId = 0
let postEndpoint:String = "https://www.testsite.com/user/login.php"
let url = NSURL(string: postEndpoint)!
let urlRequest = NSMutableURLRequest(URL: url, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 15.0)
urlRequest.HTTPMethod = "POST"
let body = "email=\(email)&password=\(password)".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
urlRequest.HTTPBody = body
let task = NSURLSession.sharedSession().dataTaskWithRequest(urlRequest) {(data, response, error) in
if data != "" && error == nil{
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! [String: AnyObject]
if let id = json["id"] as? Int {
print("found id:\(id)")
userId = id
}
} catch let error as NSError {
print("Failed to load: \(error.localizedDescription)")
userId = 2
}
}
else{
userId = 2
}
}
task.resume()
return userId
}
调用这个的代码...
success = User.login(emailTextField.text!, password: passwordTextField.text!)
print("success last: \(success)")
问题是在返回用户 ID 之前调用了“最后一次成功:”。啊啊啊啊啊啊!
【问题讨论】:
-
你不能做你想做的事。
login将在dataTaskWithRequest(urlRequest)完成处理程序运行之前完成。这就是异步的意思!正确的方法是传入你自己的完成处理程序,并在另一个完成处理程序的末尾调用它。例如,请参阅我的答案:stackoverflow.com/a/31064653/341994 -
你不能,但你可以使用
NSTimer或NSURLSession委托方法在某些数据传输后运行函数。
标签: swift asynchronous nsurlsession synchronous