我一直在尝试从服务器调用中获取信息。这已经可以正常工作,但是当我想使用这些信息使对话框出现时,它实际上是行不通的。转到下一行太快了。使它起作用的唯一方法是延迟代码中的下一位,但是考虑到它是服务器调用,我无法确定它将花费多长时间。我尝试使用dispatch_sync,但是根本没有用。
func logIn(username: String, password: String) -> Void {
var error: NSError?
var call = "api/usersession/"
var login = "username=" + username + "&password=" + password
API().getLogin(login, api:call, { (data) -> Void in
let json = JSON(data: data, error: &error)
println(json.self)
let status = json["status"].stringValue!
if (status == "1") {
alertController = UIAlertController(title: "Something went wrong", message: json["result"].stringValue, preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
} else {
alertController = UIAlertController(title: "Welcome!", message: "You're signed in", preferredStyle: UIAlertControllerStyle.Alert)
}
})
}
我相信,只要代码到达“getLogin”部分,它都会立即继续返回其所拥有的任何内容(始终为空)。当我说self.presentViewController需要延迟一定数量时,它确实可以工作,但是这会使应用感到有些笨拙。
编辑:
func getLogin(login: String, api: String, success: ((apiData: NSData!) -> Void)) {
var request = NSMutableURLRequest(URL: NSURL(string: website + api)!)
var learn = API()
var postString = login
request.HTTPMethod = "POST"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
learn.httpRequest(request, callback:{(data, error) -> Void in
if let urlData = data {
success(apiData: urlData)
}
})
}
和httpRequest:
func httpRequest(request: NSURLRequest!, callback: (NSData?,
String?) -> Void) {
var configuration =
NSURLSessionConfiguration.defaultSessionConfiguration()
var userPassWordString = apiusername + ":" + apipassword
let userPasswordData = userPassWordString.dataUsingEncoding(NSUTF8StringEncoding)
let base64EncodedCrendtial = userPasswordData!.base64EncodedStringWithOptions(nil)
let authString = "Basic \(base64EncodedCrendtial)"
configuration.HTTPAdditionalHeaders = ["Authorization": authString]
var session = NSURLSession(configuration: configuration,
delegate: self,
delegateQueue:NSOperationQueue.mainQueue())
var task = session.dataTaskWithRequest(request){
(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
if error != nil {
callback(nil, error.localizedDescription)
} else {
var result = NSData(data: data)
callback(result, nil)
}
}
task.resume()
}
最佳答案
转到下一行太快了。
您需要考虑异步操作。当您执行需要花费时间的事情时,无论是向服务器发出网络请求还是要求用户提供一些信息,您都不仅会进行函数调用并期望结果会立即显示。而是,您调用一个函数或方法来启动该过程,然后执行其他操作,直到该过程完成为止。对于网络请求,这通常意味着您提供了一个委托对象或一个完成连接,当连接具有新信息时将被调用。与用户打交道时,您可能会设置一个对话框,然后将其留在该对话框上-当用户通过点击某个按钮或填写某个字段来触发操作时,该过程将继续进行。
关于ios - Swift-函数不等待结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28746192/