FirebaseLoginしたけど、各Viewに来た時にどのようにuserがLoginしているか、いないかを判断するための忘備録です。

ポイント

各コントローラーのViewWillAppearに実装

ViewWillAppearは、コントローラーが表示するたびに呼ばれるので、、

ViewDidLoadは一度しか呼ばれません

addStateDidChangeListener関数を利用

このFirebaseの関数は大変便利です。Auth.authクラスのメソッドです。ログインしているとクロージャーで返却されたuserに値が格納されています。そこでLoginの有無を判断できます。

Loginしていない時は、ログイン画面に遷移させる


//その画面が表示される度に呼ばれる関数
    override func viewWillAppear(_ animated: Bool) {

//AuthのaddStateDidChangeListenerを利用する
// 返却されるuserでログイン判定できる
                handle = Auth.auth().addStateDidChangeListener({ (auth, user) in

//usre== nil つまり、ログインしていないなら
                    if user == nil{

//どのストーリーボードか教えてあげる
                        let storyboard = UIStoryboard(name: "Main", bundle: nil)

//上記ストーリーボード内のコントローラーを指定
                        let loginVC = storyboard.instantiateViewController(withIdentifier: "LoginVC")

//表示する
                        self.present(loginVC, animated: true)
                    } else {
//setListener関数を呼ぶ
                        self.setListener()
                    }
                })
```

setListenerは何をするのかというと,snapshotを取得してDBとの同期を取っています。

addSnapshotListener関数はDBとの同期を取る

FIRListenerRegistration型のインスタンスを利用して SELECTする。

//ここがポイント!
private var thoughtsListener: FIRListenerRegistration!


    func setListener() {
//DBのコレクションを取得 
            thoughtsListener = thoughtsCollectionRef

//条件の絞り込み
                .whereField(CATEGORY, isEqualTo: selectedCategory)
                .order(by: NUM_LIKES)
//addSnapshotListenerを設定 
                .addSnapshotListener({ (snapshot, err) in
                    if let error = err{
                        print(error)
                    }else{

//表示している配列を消去
                        self.thoughts.removeAll()

//parseData関数はsnapshotをうけとり、配列を返却する
                        self.thoughts = Thought.parseData(snapshot: snapshot)

//更新されたデータでテーブルを描画
                        self.tableView.reloadData()
                    }
                })
        }
    }