2017-05-18 5 views
1

私のアプリでは、ユーザーがUITextFieldにメールとパスワードを入力できるビューコントローラを持っています。その後、Firebaseを使ってユーザーをログインさせ、メールに関連付けられたuidを特定します。私はまたUserと呼ばれる構造体を持っています。これにはユーザー名とユーザーIDの文字列と文字列の配列が含まれています(必要ではないと思いますので、コードを提供していません。Firebaseユーザデータをクラス間で永続化するようにアプリを設定するにはどうすればよいですか?

FIRAuth.auth()?.signIn(withEmail: usernameTextBox.text!, password: passwordTextBox.text!) { (user, error) in 
     if error == nil { 
      //Valid Email and Password 
      let userID = FIRAuth.auth()?.currentUser?.uid 

      self.childRef.observe(.value, with: { snapshot in 
       for item in snapshot.children.allObjects as! [FIRDataSnapshot] { 
        let dict = item.value as! Dictionary<String,Any> 
        if (dict["UserID"] as? String == userID) { 
         self.currentUser = User(snapshot: item) //<----This is where currentUser is assigned the new User 
        } 
        //currentUser = User(snapshot:) 
        self.performSegue(withIdentifier: "LoginSegue", sender: sender) 
       } 
      }) 

     } 
     else { 
      //Error stuff 
     } 
    } 

私の問題は、次のとおりです。

は、私は前述のUIDを使用してFIRDataSnapshotを持つユーザーを初期化するために、次の手順を実行

var currentUser:User? = nil 

及びログインボタンの@IBaction方法で

変数クラスのレベルを持っています私はcurrentUser変数にアクセスする必要がある別のクラスでは(友人などを追加するために)、私はそれについてどうなるかわかりません。他のクラスのFirebaseからユーザデータを取得することはできません。なぜなら、上記のものだけが、使用するユーザ情報を特定し、変更するために必要なユーザIDにアクセスできるからです。

ログインしているコントローラと他のビューコントローラの間にSWRevealViewControllerがあり、SWRevealViewControllerがよくわからないObjective-Cで記述されているので、prepareForSegueは使用できません。私の研究は、いくつかの可能性がグローバル変数とシングルトンであるかもしれないことを明らかにしましたが、どちらかを使用することは多くのプログラマーにとって安全でない練習と見なされます。また、NSUserDefaults(私はSwift 3のUserDefaultsに名前が変更されたと思います)はもう一つの潜在的な解決策ですか?私はどんな提案にも開放的です。

ありがとうございます。

+0

他の誰かが他の方法を言及していない限り、基本VCから新しいVCのインスタンス化にアクセスできない限り、NSUserdefaultsを使用することをお勧めします。これはカスタムオブジェクトであるため、NSDataを使用してアーカイブし、保存してから、アーカイブ解除して新しいVCで使用することができます。 http://stackoverflow.com/questions/29986957/save-custom-objects-into-nsuserdefaults – Munib

+0

私があなたの質問を正しく理解していれば、どのビューでもこれを行うことができます。 –

+0

ほとんどの開発者は、非常に簡単であるため、ユーザーデータを保存して取得するために 'UserDefaults'を使用しています。方法。より安全な場所にユーザーの資格情報を保存する場合は、 'KeyChain'を使用してください。 –

答えて

1

これは任意のビューで実行できます。if currentUser =

1

複数のクラスにわたって同じユーザーデータまたはフェッチされたデータを使用する方法は複数あります。それはデータのサイズと使用方法によって異なります。

  1. あなたはそれをクリアするまで、データは再起動後に持続するだろう、でも、アプリを再起動した後、複数のクラス間でデータを永続化するためにUserDefaultsを使用することができます。ここでは

    は、これを達成するためにいくつかの簡単な方法があります。

  2. AppDelegateのようにSingletonクラスを使用して、関連するプロパティを追加することができます。 DictionaryまたはArrayのいずれかのクラスからアクセスしてください。

  3. ViewControllerを押すときに、あるクラスから別のクラスにデータを渡します。

私はあなたがそれを永続化する必要がない場合Singletonクラスを使用すると、あなたの問題のための十分な解決策になると思います。また、Singletonクラスに共通のメソッドを書くこともできますので、同じメソッドを繰り返し記述して、複数のクラスで繰り返し使用する必要はありません。一般的なものはStatic StringsまたはMacrosです。

希望します。

関連する問題