데이터를 읽어 오려는데 난관봉착 😩
일단 데이터를 읽어오는건 성공했다.
let docRef = db.collection("users").document("test")
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("Document data: \(dataDescription)")
let dictionary = document.data()! as [String : Any]
if dictionary["name"] != nil{
print(dictionary["name"] as! String)
}
} else {
print("Document does not exist")
}
}
이렇게 하면 데이터를 dictionary 형식으로 읽어와 데이터 출력 가능
테이블뷰가 로딩된 후에 데이터를 읽어오는 것인지 테이블에 반영이 안된다 😭
순서도 바꿔보고 재로딩 함수도 넣어봤지만 실패..
그러다 찾게 된 MVC 패턴!
: Model - View - Controller
의 약자. 디자인 패턴 중 하나로 애플리케이션을 세가지의 역할로 구분한 개발 방법론이다.
struct PlaceData {
let name: String?
let position: String?
// var date: Date?
// var visit: Bool?
// var tag = [String]()
}
import FirebaseFirestore
extension PlaceData {
static func build(from documents: [QueryDocumentSnapshot]) -> [PlaceData] {
var places = [PlaceData]()
for document in documents {
places.append(PlaceData(name: document["name"] as? String ?? "",
position: document["position"] as? String ?? ""))
}
return places
}
}
import FirebaseFirestore
class PlaceService {
let database = Firestore.firestore()
func get(collectionID: String, handler: @escaping ([PlaceData]) -> Void) {
database.collection("users")
.addSnapshotListener { querySnapshot, err in
if let error = err {
print(error)
handler([])
} else {
handler(PlaceData.build(from: querySnapshot?.documents ?? []))
}
}
}
}
var places = [PlaceData]() {
didSet {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
private var service: PlaceService?
private var allPlaces = [PlaceData]() {
didSet {
DispatchQueue.main.async {
self.places = self.allPlaces
}
}
}
func loadPlaceData() {
service = PlaceService()
service?.get(collectionID: "users") { places in
self.allPlaces = places
}
}
viewDidLoad()
에서 loadPlaceData()
를 실행하고
cell 설정을 places에서 불러오게 하면 완료!!
해결돼서 기쁘지만 아직은 이해가 조금 필요한거 같다..
그래도 데이터베이스 연결 성공!
: 사진 저장 & 불러오기, 데이터 추가와 삭제