포스트

3주차 과제 - Class화

약간 번외 편으로 저번과 마찬가지로 클래스화를 해야할 필요성을 느껴서

과제의 최소단계는 해두었기에, 클래스화를 좀 해서 보기 좋게 하려고 한다.

튜터님과 대화를 해봐도, 지금 이타이밍에 조금 더 간소화를 해보는게 좋다고 하셨다.

요지는 이것이다

VC가 몰라도되는 내용을 현재 가지고 있는 건 아닌지?

지금상황에선. 유일하게 하나가 있는데,

바로 DB이다.

그래서 이부분을 DBManager로 별도로 만들어 관리를 하려고 한다.

DBManager, DBModel라는 파일을 만들어 주었다.

DB

이부분에 이제 담을것이다.

우선 코드는 DB와 관련된건 전부 이관을 하였다.

코드는 생략!

이젠 어떻게 list를 전달하고 받을것이냐의 문제만 남은듯 하다.

고민을 하다가 Delegate를 사용해서 전달하는게 맞다고 판단을 했다.

그래서 DBManager에 프로토콜과 델리게이트를 만들어 주었다.

1
2
3
4
5
protocol sendLists {
    func sendDB (data : [ToDoModel])
}

var delegate : sendLists?

이렇게 전달 할 준비는 끝이 났다.

하지만 문제가 발생했다.

DB를 가져오지만 화면에는 표시가 안된다.

TableVC getData 함수를 다시 확인해 보았다.

1
2
3
4
5
6
7
8
func getData () {   
    dbManager.getData()

    DispatchQueue.main.async {
        self.tableView.reloadData()
        }

    }

그냥 함수를 잘라내고 옮긴다음 저렇게 적었는데 지금생각하니 아찔하다.

일단 저기에 print(lists)를 하니 [] 이게 떠버린다.

즉 값이 없다는 뜻이다.

값이 어디갔을까 싶어 생각을 해보다 delegate로 가져온곳에 있겠다 싶었다.

생각해보니 getData는 리턴을 하지않기에 의미가 없었다.

1
2
3
4
5
6
7
8
extension TableViewController : sendLists {
    
    func sendDB(data: [ToDoModel]) {
        lists = data
    }
    
}

여기에 프린트를 해보니 콘솔에 값이 출력된다.

즉 값을 얻어오고있다는 의미였다.

그래서 저기에다가

1
2
3
DispatchQueue.main.async {
            self.tableView.reloadData()
        }

넣어야겠다고 생각을 하고 작동을 해보니 바로 된다.

getData 함수도 바로 지워버렸다.

그리고 dbManager.getData() 해당부분만 viewDidload에 해서 값을 받아오게 하였다.

그리고 var lists : [ToDoModel] = [] 이것을 어떻게 해야할까 고민을 하다 튜터님께 여쭤보러갔다.

현재 TableVC에 변수로 선언해둔 유일한 녀석이다.

튜터님께선 먼저 왜 이걸 지울것인지에 대한 질문을 했는데, 그에대한 답변을 하면서 내가 생각한 딜레마적인 요소를 대답했다.

내가 생각하고있는 딜레마는 이것이었다.

tableVC가 알고있을 필요가 없는것들은 최대한 배제한다.

딜레마는 lists변수를 지우자니 TableView와 관련된 내용은 VC가 알아야한다. 즉 지우면 안된다.

TableVC입장에선 필요가 없는 변수이지만 TableView입장에선 필요한 내용이었다.

튜터님도 지금상황에서 내수준에서는 이대로 두는게 더 좋다고 판단을 하셨다.

이부분은 일단 그대로 두도록 하자.

이렇게 클래스화도 끝.

class화를 하면서 이전에 적었던 diagram에 변화가 생겼다.

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