LoginSignup
KAinone
@KAinone

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Swift Firebase データ取得 モデルクラス データ格納

Q&AClosed

解決したいこと

以下のコードのように、Firestoreから取得したデータを格納しておくモデルクラスをswiftファイルで作ることがあると思いますが、そのデータ各々を他クラスで参照したい(ex. 他クラスのラベルに格納してあるデータを文字列で入力したい)場合、どのように他クラスで記述すれば良いかご教授ください。

例)

import UIKit
import Firebase

class PostData: NSObject {

    var id: String
    var name: String?
    var caption: String?
    var date: Date?

    init(document: QueryDocumentSnapshot) {

        self.id = document.documentID

        let postDic = document.data()

        self.name = postDic["name"] as? String

        self.caption = postDic["caption"] as? String

        let timestamp = postDic["date"] as? Timestamp
        self.date = timestamp?.dateValue()
    }

}

自分で試したこと

以下のコードのように、他クラス(ViewController)でもモデルクラスのインスタンスを引数で受け取る形でメソッドは作れたのですが、viewDidLoad に書くとき引数に何を書けば良いのか分からず止まってしまいました。

import UIKit

class ViewContoller: UIViewController {

    let label = UILabel()

    override func viewDidLoad() {

        setPostData(<#T##postData: PostData##PostData#>)
    }

    func setPostData(_ postData: PostData) {

        label.text = ""
    }

}
0

1Answer

fetchgetDocumentsして、データを取得するのだと思いますが、
そもそも、データの追加や更新はどのようにされているのでしょうか?
その部分のコードを掲示していただけますか?

0

Comments

  1. @KAinone

    Questioner

    ご回答いただきありがとうございます。

    データの追加は以下のコードのようにしております。

    import FirebaseAuth
    import FirebaseFirestore
    import FirebaseStorage
    
    
    class PostViewController: UIViewController {
        
    //略
        
        override func viewDidLoad() {
            
            super.viewDidLoad()
            
            handlePostButton()
        }
        
    
        func handlePostButton () {
            
            let imageData = image.jpegData(compressionQuality: 1.0)
            
            let postRef = Firestore.firestore().collection(Const.PostPath).document()
            let imageRef = Storage.storage().reference().child(Const.ImagePath).child(postRef.documentID + ".jpg")
            
            let metadata = StorageMetadata()
            metadata.contentType = "image/jpeg"
            
            imageRef.putData(imageData!, metadata: metadata) { (metadata, error) in
                
                if error != nil {
                    
                    print(error!)
                    
                    return
                }
                
                let name = Auth.auth().currentUser?.displayName
                
                let postDic = [
                    "name": name!,
                    "caption": self.textField.text!,
                    "date": FieldValue.serverTimestamp(),
                ] as [String : Any]
                
                postRef.setData(postDic)
                
                self.dismiss(animated: true)
            }
            
        }
    
    }
    
  2. ↑データ追加のコードに、PostDataクラスが使われていないのはなぜですか?
    FirebaseFirestoreSwiftでググってみてください。

    以下のコードで追加したデータを取得できると思います。データは複数存在する可能性があるため、Labelに表示するデータを一つに選択(限定)する必要があると思います。

        Firestore.firestore().collection(Const.PostPath).getDocuments() { (querySnapshot, err) in
     		if let err = err {
     			print(err)
     		} else {
     			for document in querySnapshot!.documents {
     				print("\(document.documentID) : \(document.get("name") as! String)")
                    if 必要なら {
                        label.text = document.get("caption") as! String
                    }
     			}
     		}
     	}
    
  3. @KAinone

    Questioner

    丁寧に教えてくださりありがとうございます。
    今まで貼付していたコードは、SNSのタイムラインなどに投稿するためのcellに追加するデータを格納するモデルクラスの作り方を参照したものであり、元々はアカウントのプロフィール情報をFirebaseで管理したいだけだったのですが、間違えた資料を参考にしてしまっていたみたいです。
    教えていただいた方法でデータの取得をすることにしました。

    FirebaseFirestoreSwiftとは初めて知りました。初心者の私には少し理解するのが難しいですが、今後役に立ちそうなのでじっくり勉強してみます。ありがとうございました。

Your answer might help someone💌