포스트

3주차 과제 (10)

Lv.4

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

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

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

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

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

1
2
3
4
5
func backTotal () {
        segmentView.selectedSegmentIndex = 0
        todayBtn.isSelected = false
        totalBtn.isSelected = true
    }

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

나머지는 버튼이다.

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

테스트 해보니 잘된다.

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
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에 관한내용이 너무 세부적으로 작성이 되어있어서 다지우고 하나로 통일했다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.