Swift - dataTaskWithURL函数仅在调用它两次后才返回

时间:2015-12-02 20:46:57

标签: ios swift cocoa get

我正在尝试通过GETdataTaskWithURL()请求发送登录凭据,然后以字符串形式接收回复。如果回复为401 Unauthorized,则我的函数attemptLogin()应返回false。否则,它将返回true

此时此工作正常,但只有一次loginButtonPressed(sender:AnyObject)被调用两次都会发生任何事情。为什么会这样?我尝试删除dispatch_async(),因为我认为这可能会减慢速度,但这不是问题。这是我目前的代码:

//
//  LoginViewController.swift
//  Login App
//
//  Created by James Allison on 30/11/2015.
//  Copyright © 2015 James Allison. All rights reserved.
//

import UIKit

class LoginViewController: UIViewController {

    @IBOutlet weak var usernameField: UITextField!
    @IBOutlet weak var pinField: UITextField!

    @IBAction func loginButtonPressed(sender: AnyObject) {
        submitLogin()
    }

    var loginResponse:Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func submitLogin() {
        // first validate the fields
        if usernameField.text! == "" || Int(pinField.text!) == 0 {
            // empty
            print("Fill in username & password.")
        }
        else {
            if(attemptLogin(usernameField.text!, pin: pinField.text!)) {
                print("YES!")
            }
            else {
                print("NO!")
            }
        }


    }

    func attemptLogin(username: String, pin: String) -> Bool {
        // construct url
        let url = NSURL(string: "http://jamesallison.co/json.php?username=" + username + "&pin=" + pin)!

        let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) in
            if let urlContent = data {
                // convert to string
                let dataString = NSString(data: urlContent, encoding: NSUTF8StringEncoding)

                // check if 401 or not
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    if dataString == "401 Unauthorized\n" {
                        //print("incorrect login details")
                        self.loginResponse =  false
                    }
                    else {
                        //print("correct login details!")
                        self.loginResponse =  true
                    }
                })

            }
            else {
                // something failed
                print("Error: invalid URL, no response or something.")
            }
        })
        task.resume()
        return self.loginResponse
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "loginSuccess") {
            // upcoming is set to FirstViewController (.swift)
            //let upcoming: FirstViewController = segue.destinationViewController as! FirstViewController
        }
    }
}

0 个答案:

没有答案
相关问题