Blog

Swift Firebase サブコレクションを生成

FireBaseにて、サブコレクションを作る


Firebaseの関連付けについて、code から説明してみます。
日本語のblogには記事が見当たらなかったため

ポイント

DocumentSnapshot クラスを利用すること

runTransactionメソッドを利用すること

ThoughtモデルがCommentのsubCollectionをもっている例


//インスタンスをメンバにしておく
let firestore = Firestore.firestore()


//commentボタンがタップされたときの処理
    @IBAction func addCommentTapped(_ sender: Any) {

        //commentのテキストフィールドの値がnilで無いことをチェック
        guard let commentTxt = addCommentText.text else{ return }
        
//ここでtransactionを利用する
        firestore.runTransaction({ (transaction, error) -> Any? in
            
//DocumentSnapshot型のプロパティを用意しておくのがポイント
            let thoughtDocument: DocumentSnapshot
            
//エラー処理
            do{
                try thoughtDocument =

//ここで親テーブルのdocumentIdが取得できる
                transaction.getDocument(self.firestore.collection(THOUGHTS_REF)
                    .document(self.thought.documentId))
            }catch let error as NSError {
                debugPrint(error)
                return nil
            }
        
            guard let oldNumComments = thoughtDocument.data()[NUM_COMMENTS] as? Int else
            { return nil }
            
//transactionのに値をセットする
//userIdもセットする より浅い階層からアクセスできるようにしておく
            transaction.setData([
                COMMENT_TXT: commentTxt,
                TIMESTAMP: FieldValue.serverTimestamp(),
                USERNAME: self.username,

//user_idを保持するときはいつもこれを利用します。
                USER_ID: Auth.auth().currentUser?.uid ?? ""
                
            ], forDocument: newCommentRef)
            
            return nil
        }){(object, error) in
            if let error = error{
                debugPrint(error)
            }else{

//ここに入ったということは、正常に保存されているはず
//テキストフィールドの値を空にしておいて、次の処理に備える
                self.addCommentText.text = ""
            }
        }
    }

ポイントは

DocumentSnapshot クラスを利用すること

runTransactionメソッドを利用すること

Firebaseを利用すると、随分とチャットなどの開発が楽になると思いますし、モバイルファーストで新しいサービスは、Firebaseで先行開発する手法も広がるのでは無いかと個人的には思います。

transactionメソッドについての公式サイト


一つ前の記事 Swift UITextFieldがキーボードに隠れないようにする方法(ライブラリ使用)
次の記事 後方交会法とは?