MVC 패턴

Judy·2021년 6월 2일
0

파이어베이스 데이터 읽기

데이터를 읽어 오려는데 난관봉착 😩

일단 데이터를 읽어오는건 성공했다.

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 패턴!

MVC 패턴

: Model - View - Controller 의 약자. 디자인 패턴 중 하나로 애플리케이션을 세가지의 역할로 구분한 개발 방법론이다.


들어는 봤지만 모른다 생각했는데 알고보니 안드로이드 앱에도 적용했던 패턴!
그래도 익숙하진 않아 코드를 참조했다.

테이블뷰에 파이어베이스 데이터 표시


[ Place ]

struct PlaceData {
    let name: String?
    let position: String?
  //  var date: Date?
  //  var visit: Bool?
  //  var tag = [String]()
    
}

[ PlaceFirestore]

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
    }
}

[ PlaceService ]

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 ?? []))
                }
            }
    }
}

[ UITableViewController ]

    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에서 불러오게 하면 완료!!

#소감#

해결돼서 기쁘지만 아직은 이해가 조금 필요한거 같다..
그래도 데이터베이스 연결 성공!

다음목표

: 사진 저장 & 불러오기, 데이터 추가와 삭제

profile
iOS Developer

0개의 댓글