3주차 과제 (10)

 

Lv.4

1. 소팅 중인상태에서 DB에 변화가있을때 처리

지금은 소팅중인상태에서 (ex: segcontrol이 완료일때) 값의 변화가 있으면

완료가 눌러진 상태에서 전체화면이 나온다.

그것을 수정하기 위해서 전체로 선택되게 돌리는것이 최선이라고 생각을 했다.

우선 다음과같이 함수로 만들어 주었다.

func backTotal () {
        segmentView.selectedSegmentIndex = 0
        todayBtn.isSelected = false
        totalBtn.isSelected = true
    }

현재 segcontrol = 0 이 전체인 상태이다.

나머지는 버튼이다.

이걸 DB의 변화를 주는곳에 추가해주었다.

테스트 해보니 잘된다.

이렇게 하는게 현재 내가 할수있는 최선인듯하다.

2. 코드 리팩토링 및 변수이름 재조정.

DBManager에 하나로 정리하면 될걸 의미없이 몇개로 나누었다고 판단하여

최대한 CRUD에 맞게 하려고 조정했다.


protocol sendLists {
    func sendDB (data : [ToDoModel])
}

import Foundation
import FirebaseFirestore

class DBManager {
    
    var dbModel = DBModel()
    var delegate : sendLists?
    let dateFormat = DateFormatter()
    
    // MARK: - id 최댓값을 가져온다.
    func getID () -> Int {
        
        if dbModel.lists.count != 0 {
            return self.dbModel.lists[dbModel.lists.count-1].id + 1
        } else {
            return 0
        }
        
    }
    
    // MARK: - Create: DB 추가
    
    func addDB (textfield : String ) {
        
        dateFormat.dateFormat = Constants.dateFormat
        dbModel.db.collection(Constants.collectionName).addDocument(data: [Constants.DataBase.dbID: self.getID()
                                                                           , Constants.DataBase.dbTitle: textfield
                                                                           , Constants.DataBase.dbIsComplete: false, Constants.DataBase.dbIsFavorite: false
                                                                           , Constants.DataBase.dbImageTitle: "https://firebasestorage.googleapis.com/v0/b/todolist-1a790.appspot.com/o/O9IY1C0.jpg?alt=media&token=7e07e023-daf8-422d-a4ce-cdf43137e9cd"
                                                                           , Constants.DataBase.dbDate: dateFormat.string(from: Date())]) { (error) in
            if let e = error { // DB에 업로드중 에러 발생시
                print("error : \(e.localizedDescription)")
            } else { // 업로드가 성공하면 콘솔로 알려준다.
                print("Upload Done")
            }
        }
    }
    
    // MARK: - Read: 조건없이 DB로부터 값을 가져온다.
    func getData () {
        
        dbModel.db.collection(Constants.collectionName).order(by: Constants.DataBase.dbID)
            .addSnapshotListener { (querySnapshot, error) in
                
                self.dbModel.lists = []
                
                if let e = error {
                    print("error : \(e)")
                } else {
                    if let snapshotDocuments = querySnapshot?.documents {
                        for doc in snapshotDocuments {
                            let data = doc.data()
                            if let listId = data[Constants.DataBase.dbID] as? Int
                                , let listTitle = data[Constants.DataBase.dbTitle] as? String
                                , let listBool = data[Constants.DataBase.dbIsComplete] as? Bool
                                , let listFav = data[Constants.DataBase.dbIsFavorite] as? Bool
                                , let listImage = data[Constants.DataBase.dbImageTitle] as? String,
                               let listDate = data[Constants.DataBase.dbDate] as? String {
                                
                                let list = ToDoModel(id: listId, title: listTitle, isComplete: listBool, isFav: listFav, imageTitle: listImage, date: listDate)
                                self.dbModel.lists.append(list)
                                self.delegate?.sendDB(data: self.dbModel.lists)
                            }
                            
                        }
                    }
                }
            }
    }
    
    // MARK: - Read: 특정 조건에 해당하는 db가져오기 (싱글쿼리)
    func getSpecificData(whereCondition : String, condition : Any) {
        
        dbModel.db.collection(Constants.collectionName).whereField(whereCondition, isEqualTo: condition).order(by: Constants.DataBase.dbID).getDocuments { (querySnapshot, error) in
            
            self.dbModel.lists = []
            
            if let e = error {
                print(e)
            } else {
                
                if let snapshotDocuments = querySnapshot?.documents {
                    if snapshotDocuments != [] {
                        for doc in snapshotDocuments {
                            let data = doc.data()
                            if let listId = data[Constants.DataBase.dbID] as? Int
                                , let listTitle = data[Constants.DataBase.dbTitle] as? String
                                , let listBool = data[Constants.DataBase.dbIsComplete] as? Bool
                                , let listFav = data[Constants.DataBase.dbIsFavorite] as? Bool
                                ,let listImage = data[Constants.DataBase.dbImageTitle] as? String
                                , let listDate = data[Constants.DataBase.dbDate] as? String {
                                
                                let list = ToDoModel(id: listId, title: listTitle, isComplete: listBool, isFav: listFav, imageTitle: listImage, date: listDate)
                                
                                self.dbModel.lists.append(list)
                                self.delegate?.sendDB(data: self.dbModel.lists)
                                
                            }
                            
                        }
                    } else {
                        self.dbModel.lists = []
                        self.delegate?.sendDB(data: self.dbModel.lists)
                    }
                }
            }
        }
    }
    
    // MARK: - Read: 여러 조건의값 가져오기 (다중쿼리)
    func getMultiQueryData(whereCondition : String, condition : Any, anotherWhereCondition : String, anotherCondtion:Any) {
        
        dbModel.db.collection(Constants.collectionName).whereField(whereCondition, isEqualTo: condition).whereField(anotherWhereCondition, isEqualTo: anotherCondtion).order(by: Constants.DataBase.dbID).getDocuments { (querySnapshot, error) in
            
            self.dbModel.lists = []
            
            if let e = error {
                print(e)
            } else {
                
                if let snapshotDocuments = querySnapshot?.documents {
                    if snapshotDocuments != [] {
                        for doc in snapshotDocuments {
                            let data = doc.data()
                            if let listId = data[Constants.DataBase.dbID] as? Int
                                , let listTitle = data[Constants.DataBase.dbTitle] as? String
                                , let listBool = data[Constants.DataBase.dbIsComplete] as? Bool
                                , let listFav = data[Constants.DataBase.dbIsFavorite] as? Bool
                                ,let listImage = data[Constants.DataBase.dbImageTitle] as? String
                                , let listDate = data[Constants.DataBase.dbDate] as? String {
                                
                                let list = ToDoModel(id: listId, title: listTitle, isComplete: listBool, isFav: listFav, imageTitle: listImage, date: listDate)
                                
                                self.dbModel.lists.append(list)
                                
                                self.delegate?.sendDB(data: self.dbModel.lists)
                                
                            }
                            
                        }
                    } else {
                        self.dbModel.lists = []
                        self.delegate?.sendDB(data: self.dbModel.lists)
                    }
                }
            }
        }
    }
    
    // MARK: - Update : DB수정
    func editDB (mainWhereCondition :String, mainCondition: Any , sideWhereCondition: String, sideCondition: Any) {
        dbModel.db.collection(Constants.collectionName).whereField(mainWhereCondition, isEqualTo: mainCondition).getDocuments { (querySnapshot,error) in
            if let e = error {
                print(e)
            } else {
                if let documents = querySnapshot?.documents {
                    for doc in documents {
                        let docuId = doc.documentID
                        self.dbModel.db.collection(Constants.collectionName).document(docuId).setData([sideWhereCondition: sideCondition], merge: true)
                    }
                }
            }
        }
    }
    
    // MARK: - Delete: DB 제거
    func deleteCell (number : Int) {
        dbModel.db.collection(Constants.collectionName).whereField(Constants.DataBase.dbID, isEqualTo: number).getDocuments { (querySnapshot, error) in
            if let e = error {
                print(e)
            } else {
                if let documents = querySnapshot?.documents {
                    for doc in documents {
                        let docuId = doc.documentID
                        self.dbModel.db.collection(Constants.collectionName).document(docuId).delete()
                    }
                }
            }
        }
    }
}


edit에 관한내용이 너무 세부적으로 작성이 되어있어서 다지우고 하나로 통일했다.