Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

통계뷰에 CoreData 붙이기(진행중) #35

Merged
merged 2 commits into from
Dec 14, 2022
Merged

Conversation

Jinsujin
Copy link
Collaborator

@Jinsujin Jinsujin commented Dec 10, 2022

🙋🏻‍♀️ 리뷰어님께 🙋🏻

통계뷰에 데이터를 붙일려고 보니, 고민해야 할 부분이 많더군요 🥲주륵..
제 생각에는 구조적으로 변경이 필요할듯 한데, 아무래도 뷰를 직접 만드신 분과 맞춰야 할 부분이 있어 여기까지만 작업 했습니다.

📚 작업 사항

  • 이미지String 배열을 Product 배열로 변경
  • 일부 네이밍 수정
  • 늦게 버린 물건의 날짜 비교를 위해 attribute로 Date 타입 추가
  • fetchRequest 를 사용해 CoreData 에서 데이터 불러오기 <- 조건에 맞는 필터링 미적용

🌤 통계뷰에 대한 고민

1. 뷰를 먼저 그려두고 데이터를 가져와 갱신하기

    private func makeSectionView(label: String, products: [Product]) -> some View {
        VStack(alignment: .leading) {
            HStack {
                Text("\(label)(\(products.count))")
                    .font(.system(size: 18))
                    .fontWeight(.semibold)
                    .padding(.top, 10)
                Spacer()
            }
            makeHorizontalScrollView(from: products)
        }
        .padding(.leading, 16)
    }

에디님이 작성하신 위 코드의 호출부는 var body:some View{} 입니다.

  • 처음에 한 생각은 viewContext 를 사용해 데이터를 불러오기 위해서는 init 에서 coredata 의 데이터를 가져와 초기화하면 되겠다 였습니다.

  • 하지만 다시 생각해보니, 달력의 월(Month)이 바뀔때마다 이 데이터는 달라져야 합니다. 즉, 디비에서 비동기적으로 데이터를 가져와 화면에 뿌려줄 필요가 있습니다.

  • 흐름을 아마 이럴듯 합니다

    1. 통계뷰가 초기화되어 현재 Month의 화면을 그린다
    2. 현재 Month 에 해당하는 데이터를 DB에서 가져온다
    3. 디비에서 데이터를 성공적으로 가져왔다면, 이미 그려진 화면에 데이터를 갱신한다
  • Month를 변경했을때 흐름입니다.

    1. 사용자가 이전월(currentMonth - 1)을 터치한다
    2. 내용이 빈 화면을 그린다.
    3. DB 에서 이전월에 해당하는 데이터를 가져온다
    4. 3을 성공적으로 가져왔다면, 화면의 데이터를 갱신한다.

2. 로딩뷰 활용: 데이터를 먼저 가져오고 화면을 그리기

만약 데이터를 가져올때까지 로딩화면을 사용자에게 보여준다면, 우리는 시간을 더 벌 수 있을것 같습니다.
그렇다면 흐름은 다음과 같습니다:

  1. StatisView 가 초기화되면, 로딩화면을 사용자에게 보여준다
  2. 로딩화면이 뜰 동안:
  3. DB에서 데이터를 가져온다
  4. 화면을 그린다
  5. 2의 작업이 모두 완료되었다면 로딩화면을 없앤다.

질문) 위 두 방법중 어느것이 더 괜찮을까요?

- 통계에서 필요한 날짜인 실제로 청소가 된 날짜 추가
- 리스트 화면에서 물건을 비웠을때 오늘 날짜로 업데이트
- 함수명을 소문자로 변경
- 이미지이름으로 사용하고 있던 데이터 타입을 [String] 을 [Product] 로 변경
@Jinsujin Jinsujin self-assigned this Dec 10, 2022
@Jinsujin Jinsujin linked an issue Dec 10, 2022 that may be closed by this pull request
@Jinsujin Jinsujin added the ✨ feature 기능 추가 label Dec 10, 2022
Comment on lines +62 to +83
private func makeHorizontalScrollView(from products: [Product]) -> some View {
let items: [(id: ObjectIdentifier, image: Image)] = products.map { product in
var image = Image(systemName: "photo")
if (product.photo != nil), let photo = Image(data: product.photo!) {
image = photo
}
return (product.id, image: image)
}

return ScrollView(.horizontal) {
HStack {
ForEach(items, id: \.self.id) { item in
item.image
.resizable()
.frame(width: screenWidth / 6, height: screenWidth / 6, alignment: .center)
.aspectRatio(contentMode: .fit)
.clipShape(Circle())
}
}
}
}
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사용자가 사진을 등록하지 않아 coredata 에 없다면, 기본 이미지를 적용하도록 했습니다.
뷰를 생성할때 id 가 필요했기때문에 튜플을 사용해 값을 묶어줬습니다.

.padding(.horizontal, 16)

// TODO: 조건에 맞는 물건을 coredata에서 불러오기
let notYetCleaningProducts = products.filter{ $0.isCleanedUp == false }
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FetchResults 는 여기서 값을 수정할 수 없더군요 ㅜㅜ 수정이 필요합니다

@Jinsujin Jinsujin merged commit a90f484 into develop Dec 14, 2022
@Jinsujin Jinsujin deleted the feat-33-coredata-stats branch December 14, 2022 10:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ feature 기능 추가
Projects
None yet
Development

Successfully merging this pull request may close these issues.

통계화면에 CoreData 붙이기
1 participant