2017-05-10 1 views
1

皆さん、ありがとうございました。私はプログラミングに慣れていないので、細かいことがばかげて奇妙に見える場合はごめんなさい。AlamofireとcompletionHandlerの使用

私のアプリのログインページを作っています。私は2つのフィールド - 電子メールパスワードを持っています。私は、POSTリクエストを実行isLoggedInとFUNC のauthenticateUser、ブール値のプロパティメールクラスを持つクラスユーザーを、作成しました。

マイロジック:

  1. ユーザーはメールパスワードを入力し、ログインボタンを押します。これは、isLoggedInの値

  2. を持つクラスのオブジェクトを作成し、また、それは、サーバーへのPOSTリクエストを実行

  3. 応答は、このようなユーザーを確認すると、isLoggedIn変化にとメインページへのセグが実行されています。

私はAlamofireを使用しています。私が正しく理解していれば、私はisLoggedInの値を変更することができるのは、completionhandlerを使うことだけです。しかし、それは私のために働いていませんでした - isLoggedInの値は変更されませんが、結果のになります。

私は間違いがあると確信していますが、すでに4日間はどこで理解できません。どのようなアドバイスや助けをしても非常に感謝しています。 ViewControllerから

import Foundation 
import Alamofire 


class User { 


    let defaults = UserDefaults.standard 

    var email: String 
    var password: String 
    var isLoggedIn: Bool 

    init(email: String, password: String) { 
     self.email = email 
     self.password = password 
     self.isLoggedIn = false 
    } 

    // Perform authentication 
    func authenticateUser(user: User, completionHandler: @escaping (_ result: Bool) ->()) { 
     makeAuthenticateUserCall(user: user, completionHandler: completionHandler) 
    } 

    // Perform POST request 
    func makeAuthenticateUserCall(user: User, completionHandler: @escaping (Bool) ->()) { 

     let parameters = [ 
      "email" : user.email, 
      "password" : user.password 
     ] 

     Alamofire.request("http://apistaging.server.com/api/v1/login", method: .post, parameters: parameters, encoding: URLEncoding.httpBody).responseJSON {response in 

       switch response.result { 
       case .success: 
        if let json = response.result.value as? [String: Any], 
         let status = json["status"] as? String, 
         status == "success" { 
         completionHandler(true) 
        } 
       case .failure: 
        completionHandler(false) 
       } 
     } 
    } 
} 

コード:

は私のコードがある

それは実際に返される前に結果を確認
@IBAction func loginButtonPressed(_ sender: UIButton) { 

     if let email = _email.text { 
      if let password = _password.text { 
       let user = User(email: email, password: password) 
       user.authenticateUser(user: user) {resultBool in 
         user.isLoggedIn = resultBool 
        } 
       if user.isLoggedIn { 
        self.performSegue(withIdentifier: "MainPageViewController", sender: nil) 
       } 
      } 
     } 
    } 
+0

セグエが完了内部で実行する必要がありますハンドラ – dan

+0

ありがとう、なぜ、どのように? –

答えて

0

if let password = _password.text { 
    let user = User(email: email, password: password) 
    user.authenticateUser(user: user) {resultBool in 
     user.isLoggedIn = resultBool 
     if resultBool { 
      DispatchQueue.main.async { 
       self.performSegue(withIdentifier: "MainPageViewController", sender: nil) 
      } 
     } 
    } 
} 
関連する問題