2016-12-30 3 views
0

私は次のようにログインを実行しようとしている:ネストされたメソッドを終了した後にBoolの値がfalseに変更されるのはなぜですか?

func login()->Bool 
    { 
      var result:Bool = false; 
      var request = URLRequest(url: URL(string: "http://something.com/authenticate")!) 
      request.httpMethod = "POST" 
      let postString = "email=\(usernameField.text!)&password=\(passwordField.text!)" 
      print("email=\(usernameField.text!)&password=\(passwordField.text!)") 
      request.httpBody = postString.data(using: .utf8) 
      request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
      let task = URLSession.shared.dataTask(with: request) { data, response, error in 
       guard let data = data, error == nil else { 
        // check for fundamental networking error 
        print("error=\(error)") 
        result = false; 
        return 
       } 
       if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { 
        // check for http errors 
        print("statusCode should be 200, but is \(httpStatus.statusCode)") 
        print("response = \(response)") 
        print("request = \(request)") 
        result = false 
       } 
       let responseString = String(data: data, encoding: .utf8) 
       result = true; 
       print("responseString = \(responseString)") 
       self.processResponse(jsonData:data) 
      } 
      task.resume() 
      return result; 
    } 

私の「結果」変数は、常に行の結果=真がヒットした場合でも、falseに解決されます。

ネストされたメソッド内でtrueに設定するにはどうすればよいですか?

+1

ネットワーク要求が非同期であり、要求が完了する前に戻り結果が呼び出されるためです。完了ハンドラを使用する必要があります。それのための他のSO投稿を見てください。 –

+0

アウトプットを確認した後、bool.Andを返す代わりにコンプリートハンドラを使用してください。 – user3608500

+0

ありがとう@ Mr.Bistaとuser36085000。完了ハンドラが答えです。 –

答えて

1

ブロックを使用していて、「ログイン」メソッドを呼び出すとブロックが同時に呼び出されません。したがって、受信結果のブロックを実装する必要があります。次のコードを試してください:

func login(block:((Bool) -> Void)!) 
{ 
    var result:Bool = false; 
    var request = URLRequest(url: URL(string: "http://something.com/authenticate")!) 
    request.httpMethod = "POST" 
    let postString = "email=\(usernameField.text!)&password=\(passwordField.text!)" 
    print("email=\(usernameField.text!)&password=\(passwordField.text!)") 
    request.httpBody = postString.data(using: .utf8) 
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     guard let data = data, error == nil else { 
      // check for fundamental networking error 
      print("error=\(error)") 
      result = false; 
      block(result) 
      return 
     } 
     if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { 
      // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 
      print("request = \(request)") 
      result = false 
     } 
     if data != nil 
     { 
      result = true 
     } 
     let responseString = String(data: data, encoding: .utf8) 

     print("responseString = \(responseString)") 
     self.processResponse(jsonData:data) 
     block(result) 
    } 
    task.resume() 
} 
+0

そして、あなたはlogin:login { result in } –

+0

を呼び出すことができます。私のメソッドシグニチャは変更できません。私は補完ハンドラを使用しており、現在は動作しています。とにかくありがとう! –

関連する問題