2017-11-29 7 views
1

アプリに認証された後、現在のユーザーのプロフィール画像、バイオなどの情報を表示する必要がある複数のビューコントローラーがあります。現在のユーザーFirebaseの静的変数を作成していますか?

私が避けようとしている問題は、ユーザーが設定ページに入るたびに、自分のバイオ/その他の情報を取得する必要はありません。

各ビューコントローラでその情報を取得する要求を送信するのではなく、ユーザークラスに「currentUser」の静的インスタンスを作成して認証している間は、ユーザーの情報、情報を設定してから、アプリケーションに「segue」を入力して、その変数を自分の呼び出しやラベルの設定に使用します。

これをしない理由はありますか?人々は静的変数を使用しないようにアドバイスしているようですが、この場合、私はsegueを実行するたびにcurrentUserを回すよりもきれいなソリューションのようです。

あなたは、現在のユーザーを確認するためにAuth.auth().currentUserを使用すると、任意の入力は、あなたが何を取得していない、

答えて

1

シングルトンを使用するのがベストです。シングルトンは、データの流れが不規則であるため、慎重に使用することをお勧めします。

あなたのUserクラスのcurrentUserはこの基準に適合しているようです。正確にはです。

データが正しく設定されていれば、シングルトン(テストなど)を使用することの共通の懸念は、個人のテストロジックであっても対処が非常に簡単ですUIViewControllers(テスト可能なものはVC!)。これを行うには、依存性注入/嘲笑のためにあなたのUserクラスを設定する必要があります。

ここでは、後の試験に適していますアップだけでなく、設定Userシングルトン、私の考えです:私はちょうど認証データに現在のユーザを設定しますAuthinit

を持つよう

class YourUser { 

    var email: String? 
    let id: String 

    static var currentUser: YourUser? 

} 

/// Inits with a Firebase user, and sets the current user to fir user 
    /// 
    /// - Parameter firUser: Firebase user 
    init(withAuthUser authUser: AuthUser) { 

     id = authUser.uid 
     email = authUser.email 

     YourUser.currentUser = self 
} 

AuthUserは、私がAuth(テスト目的)から欲しいデータを抽象化したものに過ぎません。

protocol AuthUser: class { 
    var email: String? { get } 
    var uid: String { get } 
} 

extension User: AuthUser { } 
+1

これはOPには既にある(多かれ少なかれ)ようだ。彼は、静的変数を使用するか、毎回参照を渡すかについて質問しています。 – Connor

+0

それを指摘してくれてありがとう、私はかなり質問を正しく読んでいない。私は私の答えをよりよく調整するための情報を追加しました。 – MQLN

0

を高く評価しています。現在のユーザを返します。ログインしていない場合はnilを返します。詳細については、docsを参照してください。

0

静的変数を避ける大きな理由の1つがテストです。テストをまだ書いていない場合は、習慣に入ることを強くお勧めします。しかし、とにかく、View Controllerのロジックをテストしたいとします。そのコントローラにその静的変数への参照がたくさんある場合は、そのように止まってしまいます。テストを実行しているときに何か異なるものを返すために静的変数内の特別な場合をハックすることができますが、それが全く機能しなくても混乱することがあります。しかし、あなたのView Controllerが、現在のユーザを渡すことができるinit(またはvar)のオブジェクトをUserにすると、疑似ユーザを仮のデータで渡してテストを書くことができ、すべて動作することを保証します。

これは、私が静的変数を使用しなくなった主な理由の1つです。もう1つは同時アクセスです。あなたが同じことを参照しているオブジェクトが多くなればなるほど、別の場所で突然変異しているように、あるスポットから何かにアクセスしようとする可能性が高くなります。あるいは、いくつかの異なる領域で何かを急速に変異させ、そのオブジェクトが他の場所で突然変異した場合に対応するためのコードを書く必要があります。

これらの2つの理由が魅力的でなく、静的変数を使用したい場合は、ユーザーに関する情報を持つ軽量構造体を渡すことを強くお勧めします。 Firebase Auth Userだけではなく、新しいコントローラを入力するたびにこのフェッチを実行する必要はありません。

関連する問題