可以在新视图控制器加载之前完成dataTaskWithRequest吗?

时间:2015-03-18 02:11:03

标签: swift

我是swift的新手,我正在尝试使用dataTaskWithRequest进行发布请求。我有两个视图控制器,LoginViewController和SecondViewController。在LoginViewController中,我有提交表单登录的提交按钮,然后转到第二个视图。但是在按钮动作函数中,我调用了dataTaskWithRequest来获取身份验证。

在SecondViewController加载之前,dataTaskWithRequest如何完成他的任务?

1 个答案:

答案 0 :(得分:1)

这里的关键是登录视图控制器的按钮应该是第二个视图控制器的segue。相反,它应该只是一个@IBAction,它使用dataTaskWithRequest执行身份验证,并且只有当您确定它在completionHandler闭包中成功时才会以编程方式转换到下一个视图控制器

所以,让我们选择那个:

  1. 将登录场景中的按钮连接到@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()
    }
    

    显然,你可能想做更多的事情(例如告诉用户授权是否失败等),但这说明了移动部分:

    • 创建请求;

    • 在completionHandler中
    • ,看看授权是否成功;以及

    • 必须将您对UI执行的任何操作都调回主队列。

  2. 注意,上面假设你有一个从登录场景到第二个场景的segue。您可以通过 control 从登录场景上方的视图控制器图标拖动到第二个场景来执行此操作:

    enter image description here

    完成后,选择segue并为其指定一个唯一的情节提示ID(您将在上面的@IBAction代码中使用该ID):

    enter image description here