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

[#35] 현재 보이는 유저 카드 셀에서의 타임이 0이 되면 자동으로 다음 셀로 스크롤 구현 #38

Merged
merged 4 commits into from
Oct 8, 2023

Conversation

Minny27
Copy link
Member

@Minny27 Minny27 commented Oct 7, 2023

Motivation ⍰

  • 현재 보이는 유저 카드 셀에서의 타임이 0이 되면 자동으로 다음 셀로 스크롤 구현하기 위함

Key Changes 🔑

미리보기는 다음과 같습니다.

현재 보이는 유저 카드 셀에서의 타임이 0이되면 자동으로 다음 셀로 스크롤되고 그 셀의 타이머가 시작됩니다.
유저 카드 컬렉션 뷰의 각 셀에 대해 대한 뷰모델을 만들고 그 뷰모델에서 구독을 생성합니다.
이 때, 구독을 하는 순간부터 타이머가 돌기 때문에 현재 보이는 유저 카드 셀의 타임이 0이 됐을 때 알림을 보내기 위해
샐을 생성할 때 time이 0이 됐을 때의 동작을 delegate에 위임합니다.
그래서 isTimeOver driver의 파라미터가 true가 되면 delegate로 scrollToNext함수를 호출합니다.
delegate를 준수하는 vc에서 scrollToNext를 호출하면 timeOverTrigger event에서 void를 emit하도록 해서
timeOverTrigger가 emit할 때만 해당 셀에 대한 구독을 생성합니다.(bindViewModel)
다음 셀로 넘어가기 위해서 현재의 인덱스를 저장하는 BehaviorSubject 상수를 구독해서 index를 갱신받아서
vc에서 do(onNext:)로 특정 셀의 index 스크롤되도록 구현했습니다.

  1. 더 쉽게 구현할 수 있는 방법이 있을 지 궁금합니다.
  • viewModel에서 input, output, tranform의 형태를 유지하려다보니 저도 vm에서 구독하게 되는 상황이 나오게 되더군요..
  1. 네트워크 에러나 다른 탭으로 넘어갔을 떄 시간을 멈춰야할 거 같은데 Driver는 complete를 하지 않다보니
    중지 및 재개를 어떻게 구현할지 좀 고민됩니다.

To Reviewers 🙏🏻

  • 현재 보이는 유저 카드 셀의 타이머가 0초가 됐을 때, 다음 셀로 자동으로 넘어가는지 확인해주세요
  • 메모리 누수나 구독이 중복이 생기지 않을 지도 한 번 봐주세요

Linked Issue 🔗

- TFBaseCollectionViewCell 커스텀
- 임시 UserResponse, UserSection DTO 및 모델 구현
- viewWillAppear 이벤트를 받 trigger input 구현
- 임시 userList output 구현
- state -> timeState
- cell 모델 구현
- isTimeOver driver의 파라미터가 true가 되면 delegate로 scrollToNext함수를 호출
- delegate를 준수하는 vc에서 scrollToNext를 호출하면 timeOverTrigger event에서 void를 emit하도록 해서
timeOverTrigger가 emit할 때만 해당 셀에 대한 구독을 생성(bindViewModel)
@Minny27 Minny27 added the 🦊 Feature New feature or request label Oct 7, 2023
@Minny27 Minny27 requested review from ibcylon and ChaNoo97 October 7, 2023 08:11
@Minny27 Minny27 self-assigned this Oct 7, 2023
Copy link
Member

@ibcylon ibcylon left a comment

Choose a reason for hiding this comment

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

고생하셨습니다.
RxDataSources 사용시 Preview가 안되더라구요.
DiffableDataSource로 변경하였더니 됩니다.

Diffable로 변경한 코드도 첨부할테니 반영해보시는 것도 좋을 것 같습니다.

return ControlEvent(events: source)
}
}
#if DEBUG
Copy link
Member

Choose a reason for hiding this comment

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

Preview 부분 디버그로 이동
RxDataSource 사용 시 Preview 사용 안 됨

Copy link
Member Author

Choose a reason for hiding this comment

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

이 부분도 확인했습니다!


let userList = Driver.just(userSectionList)

let currentPage = timeOverTrigger.withLatestFrom(currentIndex.asDriver(onErrorJustReturn: 0)) { _, page in
Copy link
Member

Choose a reason for hiding this comment

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

timeOverTrigger랑 합성 시 맨 처음 실행이 안되어서 수정 startWith(0) 추가함

Copy link
Member Author

Choose a reason for hiding this comment

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

0번 째 셀일 때의 처리를 고민했었는데, 두 시퀀스를 withLatestFrom으로 합성해서 startWith으로 처음 값을 추가할 수 있다는 것을 알았네요bb

@Minny27
Copy link
Member Author

Minny27 commented Oct 8, 2023

확인해주셔서 감사하고 머지하겠습니다!

@Minny27 Minny27 merged commit 741304b into main Oct 8, 2023
@Minny27 Minny27 deleted the Feature/usercard_pagingview branch October 20, 2023 05:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🦊 Feature New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants