2015-10-17 63 views
0

這可能有點晦澀的問題,但我似乎無法弄清楚這裏發生了什麼。我有一個「登錄」功能,可以根據API檢查用戶名和密碼。由於某種原因,第一次調用該函數返回false,但是如果我第二次調用該函數,它將返回適當的true,假設我輸入了正確的憑證。我的功能總是在第一次返回false

下面是函數:

if testLogin(usernameTextField.text!, password: passwordTextField.text!) { 
      performSegueWithIdentifier("dismissLogin", sender: self) 
     } else { 
      let alert = UIAlertView() 
      alert.title = "Login Problem" 
      alert.message = "Wrong username or password." 
      alert.addButtonWithTitle("Dismiss") 
      alert.show() 
     } 
    } 

TESTLOGIN功能出現在這裏;

func testLogin(username: String, password: String) -> Bool { 

    let jsonString = "{\"username\":\"\(username)\",\"password\":\"\(password)\"}" 
    let myURL = "http://myurl.com/api/login.php" 

    let url:NSURL = NSURL(string: myURL)! 
    let session = NSURLSession.sharedSession() 

    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

    request.HTTPBody = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 

    let task = session.dataTaskWithRequest(request) { 
     (
     let data, let response, let error) in 

     guard let _:NSData = data, let _:NSURLResponse = response where error == nil else { 
      print("error") 
      return 
     } 

     do { 
      let json:AnyObject? = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) 

      if let result = json as? [String: AnyObject] { 
       if let status = result["Status"] as! Int? { 
        if status == 200 { 
         self.loginCheck = true 
        } else { 
         self.loginCheck = false 
        } 
       } 
      } 
     } catch { 
      print(error) 
     }    
    } 
    task.resume() 
    return loginCheck 
} 

對不起。然而,我似乎無法理解,爲什麼第一次調用testLogin返回false,但第二次調用它返回true。就好像這個函數沒有足夠快地調用這個網站並且返回false,但是我第二次調用這個函數時,它有時間去檢查這個網站了嗎?

+0

「* dataTaskWithRequest的另一種變體是**異步** ...」*主題... –

+0

感謝@MartinR。這不可避免地是** dataTaskWithRequest是異步**主題的副本,我只是沒有意識到它。 – ZbadhabitZ

回答

1

您的方法testLogin不正確。方法dataTaskWithRequest是異步的。您需要創建兩個回調successfailure(關閉)。如果請求完成,將會調用哪個。看看這個https://github.com/Alamofire/Alamofire

+0

感謝您的回覆。我實際上嘗試過實施封閉,但似乎沒有得到相同的結果。我花了一些時間進一步研究,現在工作正常;謝謝!我故意避免使用任何第三方庫(如Alamofire),只是爲了瞭解事情如何依靠我自己的基礎。我很欣賞這個建議。 – ZbadhabitZ

+0

沒問題。 「我故意避免使用任何第三方庫(如Alamofire)」。你可以看看執行情況並做出結論。 – Vladimir