Skip to content

Conversation

@0Hooni
Copy link
Collaborator

@0Hooni 0Hooni commented Nov 27, 2024

🤔 배경

  • 스티커 삭제 동작이 필요했습니다.
  • 삭제 동작이 동시 편집 상황에 맞게 적용되어야 했습니다.

📃 작업 내역

  • 스티커 삭제 UI를 구현했습니다.
  • 스티커 삭제 이벤트 반영을 구현했습니다.

추가 작업

  • EditPhotoRoomViewController가 하위 View의 인스턴스를 지속적으로 접근하던 환경을 개선하였습니다.
  • ViewModel에 접근하여 메서드 호출하는 상황을 In/Out 패턴에 맞게 개선하였습니다.

✅ 리뷰 노트

책임 분리 및 리팩토링

  • EditPhotoRoomViewController에서 CanvasScrollView를 직접 참조하는 상황이 많았습니다.
  • 이러한 참조를 이용해서 기능하는 메서드들이 ViewController에 많은 상황이었습니다.
  • 이러한 책임을 분리하기 위해 CanvasScrollView에 메서드를 요청하는 방식으로 리팩터링을 하였습니다.
  • 해당 과정에서 Delegate가 추가되었습니다
protocol CanvasScrollViewDelegate: AnyObject {
    func canvasScrollView(_ canvasScrollView: CanvasScrollView, didAdd sticker: StickerEntity)
}

삭제 로직 관련

  • 기존에 CanvasScrollView에서 특정 StickerView를 찾기 위해
  • 이를 위해 ViewController에서 [UUID: Index] 형태의 인스턴스를 별도로 관리했었습니다.
private var stickerViewDictonary: [UUID: StickerView]

위와 같은 변경을 한 이유는 삭제시 Index기반으로 SubView 참조 하는 경우 삭제시 기존의 Index와 일치하지 않거나 Out of range와 같은 문제가 발생합니다.

이러한 상황을 개선하기 위해 CanvasScrollView에서 StickerViewDictonary에 ID를 이용해 동일하게 O(1)SubView에서 StickerView를 찾아낼 수 있도록 하였습니다.

어차피 해당 StickerView는 메모리에 존재하는 동안 같은 주소를 참조하고 있기에 추가적인 리소스가 들지 않는다고 생각했습니다.

현재 StickerView 삭제를 위해서는 아래와 같은 방식으로 작동합니다.

  • SoT인 StickerList를 파라미터로 받는다.
  • LocalStickerList의 ID만 담은 StickerIdList를 생성해줍니다.
  • 로컬과 SoT를 비교하여 SoT에 없는 로컬 항목을 찾습니다
  • 가서 반갈죽 해주고 옵니다 👍
private func prepareForApply(_ stickerList: [StickerEntity]) {
    let stickerIdList = stickerViewDictonary.keys.map { $0 }
    
    Set(stickerIdList)
        .subtracting(stickerList.map { $0.id })
        .forEach { deleteStickerView(with: $0) }
}

🎨 스크린샷

실행 결과
Screen Recording Nov 27 2024

🚀 테스트 방법

  • EditPhotoRoomFeatureDemo앱을 두개의 시뮬레이터에서 실행합니다
  • 한쪽에서 Offer를 해줍니다
  • 두 기기를 Guset와 Host로 나누어 삭제 상황을 테스팅 하시면 됩니다 👍

hsw1920 and others added 22 commits November 26, 2024 22:07
Co-Authored-By: YeongHoon Song <37678646+0Hooni@users.noreply.github.com>
- 실제 User가 ViewModel에 존재할 때 수정 예정

Co-Authored-By: YeongHoon Song <37678646+0Hooni@users.noreply.github.com>
Co-Authored-By: YeongHoon Song <37678646+0Hooni@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: YeongHoon Song <37678646+0Hooni@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
- StickerView가 추가되는 시점에 EditPhotoViewModel에 input을 주기 위해 필요했습니다.
- StickerView 생성 책임을 기존에는 ViewController가 가졌지만, CanvasScrollView로 이전하면서 필요해졌습니다.

Co-Authored-By: YeongHoon Song <37678646+0Hooni@users.noreply.github.com>
- ViewController에서 CanvasScrollView를 직접 참조하여 업데이트 하고 있던 방식을 변경하였습니다.
- ViewController는 CanvasScrollView의 메서드 호출을 통해 요청해야 합니다.
- CanvasScrollView의 updateCanvas 메서드의 가독성을 개선하였습니다.
- 일부 메서드의 네이밍을 변경하였습니다.

Co-Authored-By: YeongHoon Song <37678646+0Hooni@users.noreply.github.com>
Co-Authored-By: YeongHoon Song <37678646+0Hooni@users.noreply.github.com>
- CanvasScrollView의 imageView의 접근제어 수정
- ViewController에서 CanvasScrollView에게 SharePhoto Data를 요청하도록 변경

Co-Authored-By: YeongHoon Song <37678646+0Hooni@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
Co-Authored-By: seuhong <66902876+hsw1920@users.noreply.github.com>
@0Hooni 0Hooni added ✨ feat 새로운 기능 추가 ⚙️ refactor 코드 정상화 labels Nov 27, 2024
@0Hooni 0Hooni linked an issue Nov 27, 2024 that may be closed by this pull request
2 tasks
@youn9k
Copy link
Member

youn9k commented Nov 30, 2024

LGTM 함수 분리가 잘되어있네요!!

Copy link
Member

@Kiyoung-Kim-57 Kiyoung-Kim-57 left a comment

Choose a reason for hiding this comment

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

함수가 역할 별로 분리가 잘 되어 있어요! 그리고 성능을 위해 Set을 사용해주신 점 인상 깊었습니다!

@hsw1920 hsw1920 merged commit 2e27d22 into develop Nov 30, 2024
1 check passed
@hsw1920 hsw1920 deleted the feat/#115-sticker-delete-ui branch November 30, 2024 05:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ feat 새로운 기능 추가 ⚙️ refactor 코드 정상화

Projects

None yet

Development

Successfully merging this pull request may close these issues.

스티커를 삭제할 수 있다

5 participants