RxSwift Firebase Firestore データ取得メモ


Firebase FirestoreのデータをRxSwiftで取得するためのメモ

メモなので今後も追記予定

    func getData() -> Observable<[Model]?> {
        guard let uid = Auth.auth().currentUser?.uid else { return Observable.just(nil) }
        return Observable.create { (observer: AnyObserver<Model?>) -> Disposable in
            Firestore.firestore().document("path to data/\(uid)").getDocument { (document, error) in
                if let error = error {
                    observer.onError(error)
                    return
                }
                guard let document = document, document.exists else {
                    observer.onError( /* データなしエラー */ )
                    return
                }
                // DocumentSnapshottから変換して返す
                let model = try? Model(from: document)
                observer.on(.next(model))
                observer.onCompleted()
            }
            return Disposables.create()
        }
    }

RxFirebaseを使う場合

    func getData() -> Observable<[Model]?> {
        guard let uid = Auth.auth().currentUser?.uid else { return Observable.just(nil) }
        return database.collection("path to datas").document(uid).rx.getDocument().map(Model.init)
    }

オプショナルをなくす場合

    func getData() -> Observable<[Model]> {
        guard let uid = Auth.auth().currentUser?.uid else { return Observable.error( /* 定義していた何かのエラー */ ) }
        return database.collection("path to datas").document(uid).rx.getDocument().map(Model.init)
    }