更快分配网络响应

Assign network response sooner

我正在开发一个依赖网络服务后端的应用程序。我有一个单独的 class API 来处理所有网络活动并将数据发送到相关的视图控制器。

我有一个 NSURLSession.dataTaskWithRequest(),它通过 POST 将我的数据发送到我的 API 和 returns 一个响应。我认为最好在我的 API class 中使用一个变量 networkResponse 以及 getter 和 setter,因为我只需要一个响应一次。

在我的 ViewController 中,我有一个登录表单,它向 API 发出请求并根据响应让用户登录。如果凭据不正确,它 returns UIAlertController 中的响应。

在测试不正确的凭据时,我发现没有及时为 AlertController 调用响应,因此它只显示一条空白消息。如果我关闭它并立即再次单击登录,它会显示响应。我将如何让它更快地显示出来?

登录函数:

class func login (username: String, password: String) {
    config.HTTPAdditionalHeaders = ["Authorization" : authorization]
    let url : NSURL = NSURL(string: "\(root)PHP/login.php")!

    let request = NSMutableURLRequest(URL: url)
    var returnString : NSString = ""
    request.HTTPMethod = "POST"
    let postString = "username=\(username)&password=\(password)"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    var networkTask = mySession.dataTaskWithRequest(request) {
        data, response, error in
        var err : NSError?

        dispatch_async(dispatch_get_main_queue()) {
            /* Setting response variable here */
            self.setNetworkResponse(NSString(data: data, encoding: NSUTF8StringEncoding)!)
        }
    }
    networkTask.resume()
}

呼叫 API:

@IBAction func login(sender: AnyObject) {
    if !txtUsername.text.isEmpty || !txtPassword.text.isEmpty {
        API.login(txtUsername.text, password: txtPassword.text)

警报:

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
    if identifier == "segueLogin" {
        if API.getNetworkResponse() !== "true" {
            var alert = UIAlertController(title: "Message", message: API.getNetworkResponse() as String, preferredStyle: .Alert)

虽然这可能不是最理想的解决方案,但我设法通过设置延迟来解决问题,使用 shouldPerformSegueWithIdentifier 中的 dispatch_after 将警报延迟大约 5 秒。该消息现在第一次出现,这正是我要找的。