해당 게시글은 네이버부스트캠프에서 그룹 프로젝트를 진행하며 기록하는 내용입니다.
틀린 내용이 있을 수 있습니다.
저희 프로젝트는 WeTri입니다.
많이 구경하러 와주세요!
https://github.com/boostcampwm2023/iOS08-WeTrihttps://github.com/boostcampwm2023/iOS08-WeTri
현재 아래와 같은 뷰를 작업하고 있는데요!
기록 여부에 따라서 분기처리를 해줘야할 것 같은데..
어떻게 해줘야할지 고민이 되었습니다!
이 고민을 하기 시작하니까 그렇다면 기록 데이터를 어디서 어느시점에 받아와야할지가 고민되더라구요 😅
처음에는 오늘 날짜의 기록데이터를 해당 탭의 root에서 보여줘야 하기 때문에 2가지 선택지가 있었던 것 같습니다.
1. 앱을 시작할 때 데이터를 받고 Coordinator로 전달하는 방법
2. ViewModel에서 ViewController의 viewDidLoad()를 입력으로 받아드려서 ViewController가 시작됐다는 입력을 받고 Repository를 통해 Data를 받아와서 업데이트하는 방법
저는 2번째 방법을 선택했습니다.
우선, 앱을 시작할 때 데이터를 받게되는 경우가 늘어나게 된다면, 앱의 init 시점에 앱에 과부하가 올 수 있다고 판단했습니다. 그렇게 헤비한 앱은 아니지만, 처음부터 앱의 init시점에 데이터를 받아오는 구조로 만든다면 분명 다음에 또 로직이 추가될 것이고 로직이 추가될 수록 유저에게 안좋은 경험을 주겠죠..
다음으로 해당 뷰가 보일 때 데이터를 불러와도 뷰를 갱신하기까지 시간이 오래걸리지 않을거라고 판단했습니다. 서버에서 이미지와 같은 크기가 큰 데이터를 불러오는게 아닌 오늘의 기록 그 자체의 데이터만 가져올 것이기 때문입니다.
그래서 저는 아래와 같은 방법으로 구현하려고 합니다!
1. Default로 label만 있는 View를 보여줍니다.
2. ViewModel에서 Data를 받아온 경우 CollectionView로 교체해줍니다.
해당 로직은 다음과 같이 구현했습니다.
고민할때만해도, 이렇게 간단하게 구현하게 될 줄은 꿈에도 상상못했습니다..ㅎㅎ
컬렉션 뷰와 기록이 없을 때 사용할 noRecordsView의 위치가 같은곳에 위치해야하기 때문에 오토레이아웃을 같게 잡아줬습니다.
view.addSubview(workoutInformationCollectionView)
NSLayoutConstraint.activate([
workoutInformationCollectionView.topAnchor.constraint(equalTo: todayLabel.bottomAnchor, constant: Metrics.componentInterval),
workoutInformationCollectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
workoutInformationCollectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
view.addSubview(noRecordsView)
NSLayoutConstraint.activate([
noRecordsView.topAnchor.constraint(equalTo: todayLabel.bottomAnchor, constant: Metrics.componentInterval),
noRecordsView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
noRecordsView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
그리고 ViewModel에서 데이터를 받아왔을 때, 실패한다면 collectionView를 숨기고 noRecordsView를 표시했습니다.
case let .failure(error as RecordUpdateUseCaseError) where error == .noRecord:
self?.workoutInformationCollectionView.isHidden = true
self?.noRecordsView.isHidden = false
성공한다면, collectionView를 보여주고 noRecordsView를 숨겨줬습니다.
func render(output: RecordListState) {
switch output {
case .idle:
break
case let .sucessRecords(records):
let workoutInformationItems = records.map {
WorkoutInformationItem(sport: $0.mode.description, time: $0.timeToTime, distance: "\($0.distance)km")
}
configureSnapShot(items: workoutInformationItems)
workoutInformationCollectionView.isHidden = false
noRecordsView.isHidden = true
//...
이렇게 기록여부에 따른 분기처리를 완료했습니다..!
혹시 궁금한점이 있으시다면 댓글 부탁드리겠습니다.
'네이버 커넥트재단 부스트캠프 > 그룹프로젝트' 카테고리의 다른 글
[WeTri] CustomCalendar 만들기 (0) | 2023.11.27 |
---|---|
[WeTri][OAuth] 애플로그인 with 백엔드 (0) | 2023.11.22 |
[WeTri] 하나의 뷰컨에 여러가지 역할을 가져도 될까? (1) | 2023.11.19 |
댓글