我是swift的新手,我正在尝试使用dataTaskWithRequest进行发布请求。我有两个视图控制器,LoginViewController和SecondViewController。在LoginViewController中,我有提交表单登录的提交按钮,然后转到第二个视图。但是在按钮动作函数中,我调用了dataTaskWithRequest来获取身份验证。
在SecondViewController加载之前,dataTaskWithRequest如何完成他的任务?
答案 0 :(得分:1)
这里的关键是登录视图控制器的按钮应该不是第二个视图控制器的segue。相反,它应该只是一个@IBAction
,它使用dataTaskWithRequest
执行身份验证,并且只有当您确定它在completionHandler
闭包中成功时才会以编程方式转换到下一个视图控制器
所以,让我们选择那个:
将登录场景中的按钮连接到@IBAction
,创建请求,启动它,然后在完成块中确定它是否成功,如果是,则告诉:
@IBAction func didTapLoginButton(sender: UIButton) {
let request = NSMutableURLRequest(URL: NSURL(string: "loginurl")!)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.HTTPBody = ...
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
if data == nil {
// handle error here
println("\(error)")
} else {
// parse response here and determine if successful
var loginSuccessful: Bool = ...
if loginSuccessful {
dispatch_async(dispatch_get_main_queue()) { () -> Void in
self.performSegueWithIdentifier("SegueToSecond", sender: sender)
}
}
}
}
task.resume()
}
显然,你可能想做更多的事情(例如告诉用户授权是否失败等),但这说明了移动部分:
创建请求;
,看看授权是否成功;以及
必须将您对UI执行的任何操作都调回主队列。
注意,上面假设你有一个从登录场景到第二个场景的segue。您可以通过 control 从登录场景上方的视图控制器图标拖动到第二个场景来执行此操作:
完成后,选择segue并为其指定一个唯一的情节提示ID(您将在上面的@IBAction
代码中使用该ID):