From 02aef9c357c55493a8b92d7d09ebd7c2d2f309cb Mon Sep 17 00:00:00 2001 From: Gordon Choi Date: Wed, 7 Dec 2022 02:28:55 +0900 Subject: [PATCH] =?UTF-8?q?#141=20feat:=20=EC=A0=84=EC=B2=B4=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=80=EC=83=89=20=EB=A1=9C=EC=A7=81=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/MusicRepository.swift | 27 +++++++++++++--- .../Domain/UseCase/SearchMusicUseCase.swift | 22 +++++++++++-- .../ViewModel/DiaryEditViewModel.swift | 32 +++++++++++++++++++ 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/Segno/Segno/Data/Repository/MusicRepository.swift b/Segno/Segno/Data/Repository/MusicRepository.swift index df347cf..d946a2b 100644 --- a/Segno/Segno/Data/Repository/MusicRepository.swift +++ b/Segno/Segno/Data/Repository/MusicRepository.swift @@ -16,20 +16,39 @@ protocol MusicRepository { } final class MusicRepositoryImpl: MusicRepository { - private let shazamSession = ShazamSession() - private let musicSession = MusicSession() + private let shazamSession: ShazamSession + private let musicSession: MusicSession + private let disposeBag = DisposeBag() var shazamSearchResult = PublishSubject() - func startSearchingMusic() { + init(shazamSession: ShazamSession = ShazamSession(), + musicSession: MusicSession = MusicSession()) { + self.shazamSession = shazamSession + self.musicSession = musicSession + subscribeSearchresult() + } + + func startSearchingMusic() { + shazamSession.start() } func stopSearchingMusic() { - + shazamSession.stop() } func playMusic() { } } + +extension MusicRepositoryImpl { + private func subscribeSearchresult() { + shazamSession.result + .subscribe(onNext: { + self.shazamSearchResult.onNext($0) + }) + .disposed(by: disposeBag) + } +} diff --git a/Segno/Segno/Domain/UseCase/SearchMusicUseCase.swift b/Segno/Segno/Domain/UseCase/SearchMusicUseCase.swift index a9d769f..41abb80 100644 --- a/Segno/Segno/Domain/UseCase/SearchMusicUseCase.swift +++ b/Segno/Segno/Domain/UseCase/SearchMusicUseCase.swift @@ -17,6 +17,8 @@ protocol SearchMusicUseCase { } final class SearchMusicUseCaseImpl: SearchMusicUseCase { + private let disposeBag = DisposeBag() + let musicRepository: MusicRepository var musicInfoResult = PublishSubject() @@ -25,10 +27,26 @@ final class SearchMusicUseCaseImpl: SearchMusicUseCase { } func startSearching() { - + musicRepository.startSearchingMusic() } func stopSearching() { - + musicRepository.stopSearchingMusic() + } +} + +extension SearchMusicUseCaseImpl { + private func subscribeShazamResult() { + musicRepository.shazamSearchResult + .subscribe(onNext: { + switch $0 { + case .success(let shazamSong): + let musicInfo = MusicInfo(shazamSong: shazamSong) + self.musicInfoResult.onNext(.success(musicInfo)) + case .failure(let error): + self.musicInfoResult.onNext(.failure(error)) + } + }) + .disposed(by: disposeBag) } } diff --git a/Segno/Segno/Presentation/ViewModel/DiaryEditViewModel.swift b/Segno/Segno/Presentation/ViewModel/DiaryEditViewModel.swift index efd8ff8..8ddb352 100644 --- a/Segno/Segno/Presentation/ViewModel/DiaryEditViewModel.swift +++ b/Segno/Segno/Presentation/ViewModel/DiaryEditViewModel.swift @@ -8,6 +8,7 @@ import RxSwift final class DiaryEditViewModel { + private let disposeBag = DisposeBag() var diaryDetail: DiaryDetail? // 에딧 화면에 들어갈 여러 요소들 @@ -16,11 +17,14 @@ final class DiaryEditViewModel { // 위치 검색 유즈케이스 var isSearching = BehaviorSubject(value: false) + var musicInfo = PublishSubject() init(diaryDetailUseCase: DiaryDetailUseCase = DiaryDetailUseCaseImpl(), searchMusicUseCase: SearchMusicUseCase = SearchMusicUseCaseImpl()) { self.diaryDetailUseCase = diaryDetailUseCase self.searchMusicUseCase = searchMusicUseCase + + subscribeSearchingStatus() } func addTags() { @@ -28,7 +32,35 @@ final class DiaryEditViewModel { } func toggleSearchMusic() { + guard let value = try? isSearching.value() else { + return + } + value ? isSearching.onNext(false) : isSearching.onNext(true) + } + + func subscribeSearchingStatus() { + isSearching + .subscribe(onNext: { + $0 ? self.startSearchingMusic() : self.stopSearchingMusic() + }) + .disposed(by: disposeBag) + } + + func startSearchingMusic() { + searchMusicUseCase.startSearching() + } + + func stopSearchingMusic() { + searchMusicUseCase.stopSearching() + } + + func subscribeSearchResult() { + searchMusicUseCase.musicInfoResult + .subscribe(onNext: { + self.musicInfo.onNext($0) + }) + .disposed(by: disposeBag) } func setLocation() {