fetch
やgetDocuments
して、データを取得するのだと思いますが、
そもそも、データの追加や更新はどのようにされているのでしょうか?
その部分のコードを掲示していただけますか?
Swift Firebase データ取得 モデルクラス データ格納
解決したいこと
以下のコードのように、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 = ""
}
}
1Answer
Comments
@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) } } }
↑データ追加のコードに、
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 } } } }
@KAinone
Questioner丁寧に教えてくださりありがとうございます。
今まで貼付していたコードは、SNSのタイムラインなどに投稿するためのcellに追加するデータを格納するモデルクラスの作り方を参照したものであり、元々はアカウントのプロフィール情報をFirebaseで管理したいだけだったのですが、間違えた資料を参考にしてしまっていたみたいです。
教えていただいた方法でデータの取得をすることにしました。FirebaseFirestoreSwiftとは初めて知りました。初心者の私には少し理解するのが難しいですが、今後役に立ちそうなのでじっくり勉強してみます。ありがとうございました。