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에 관한내용이 너무 세부적으로 작성이 되어있어서 다지우고 하나로 통일했다.
PREVIOUS3주차 과제 (9)
NEXT챌린지반 과제 (1)