Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions challenge/challenge/Model/HomeSection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,8 @@ enum LayoutType {
case card
case list
}

struct MusicSection {
let section: HomeSection
let items: [Music]
}
25 changes: 0 additions & 25 deletions challenge/challenge/Model/Music.swift

This file was deleted.

19 changes: 0 additions & 19 deletions challenge/challenge/Model/Podcast.swift

This file was deleted.

27 changes: 27 additions & 0 deletions challenge/challenge/Model/iTunesResponse.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// iTunesResponse.swift
// challenge
//
// Created by 손영빈 on 3/19/26.
//

import Foundation

struct iTunesResponse<T: Codable>: Codable {
let results: [T]
}

struct Music: Codable, Hashable {
let trackName: String?
let artistName: String?
let collectionName: String?
let artworkUrl60: String? // 앨범커버
let artworkUrl100: String?
}

struct Podcast: Codable, Hashable {
let trackName: String?
let artistName: String?
let artworkUrl100: String?
let artworkUrl600: String?
}
2 changes: 1 addition & 1 deletion challenge/challenge/ViewModel/HomeViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class HomeViewModel: ViewModel {
let observable = sectionInfo.map { section, term -> Observable<MusicSection> in
guard let url = NetworkManager.shared.url(term: term, media: "music") else { return .error(NetworkError.requestError) }
return NetworkManager.shared.fetch(url: url)
.map { (response: MusicResponse) in // MusicResponse -> MusicSection으로 반환
.map { (response: iTunesResponse<Music>) in // MusicResponse -> MusicSection으로 반환
MusicSection(section: section, items: response.results)
}.asObservable()
}
Expand Down
51 changes: 20 additions & 31 deletions challenge/challenge/ViewModel/SearchViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,38 +28,27 @@ class SearchViewModel: ViewModel {
.filter { !$0.isEmpty }
.share()

let podcast = searchText
.flatMap { [weak self] term -> Observable<[Podcast]> in
guard let self else { return .just([] as [Podcast])}
guard let url = NetworkManager.shared.url(term: term, media: "podcast") else {
self.errorSubject.onNext(.requestError)
return .just([] as [Podcast])
}
return NetworkManager.shared.fetch(url: url)
.map { (response: PodcastResponse) in response.results }
.asObservable()
.catch { [weak self] error in
self?.errorSubject.onNext(error as! NetworkError)
return .just([] as [Podcast])
}
}

let music = searchText
.flatMap { [weak self] term -> Observable<[Music]> in
guard let self else { return .just([] as [Music]) }
guard let url = NetworkManager.shared.url(term: term, media: "music") else {
self.errorSubject.onNext(.requestError)
return .just([] as [Music])}
return NetworkManager.shared.fetch(url: url)
.map { (response: MusicResponse) in response.results }
.asObservable()
.catch { [weak self] error in
self?.errorSubject.onNext(error as! NetworkError)
return .just([] as [Music])
}
}
let searchResult = Observable.zip(podcast, music)
let podcast: Observable<[Podcast]> = search(searchText: searchText, media: "podcast")
let music: Observable<[Music]> = search(searchText: searchText, media: "music")
let searchResult = Observable.zip(podcast, music).share()

return Output(searchResult: searchResult, error: errorSubject.asObservable())
}

private func search<T: Codable>(searchText: Observable<String>, media: String) -> Observable<[T]> {
searchText.flatMap { [weak self] term -> Observable<[T]> in
guard let self else { return .just([])}
guard let url = NetworkManager.shared.url(term: term, media: media) else {
self.errorSubject.onNext(.requestError)
return .just([])
}
return NetworkManager.shared.fetch(url: url)
.map { (response: iTunesResponse<T>) in response.results }
.asObservable()
.catch { [weak self] error in
self?.errorSubject.onNext(error as! NetworkError)
return .just([])
}
Comment thread
ybin4548 marked this conversation as resolved.
}
}
}