์ฐธ๊ณ ๋ฐ ์ถ์ฒ ์ฌ์ดํธ
https://www.youtube.com/watch?v=TlJUMVKtUhc&list=PLwvDm4Vfkdphbc3bgy_LpLRQ9DDfFGcFu&index=7
Service layer์ ์ญํ
- ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๋ ๋ชจ๋ ๋ก์ง์ ํฌํจํ ๋คํธ์ํฌ ๋ ์ด์ด
- ๋ฐ์ดํฐ๋ฅผ ๋์ฝ๋ฉ ํ๊ณ ๋ทฐ ๋ชจ๋ธ๋ก ์ ๋ฌํ๋ ์ญํ์ ํจ
Services ์์ฑ
- New file > Swift ํ์ผ ์ ํ ํ PrefixDataService.swift ํ์ผ ์์ฑ
Published ๋ณ์ ์ ์ธ
@Published var allCoins: [CoinModel] = []
- @Published ํ๋กํผํฐ ๋ฉํผ๋ฅผ ์ฌ์ฉํด์ ํผ๋ธ๋ฆฌ์ ๋ฅผ ์์ฑํจ
- subscriber๊ฐ ํผ๋ธ๋ฆฌ์ ๋ก ์ ์ธ๋ ๋ณ์๋ฅผ ๊ตฌ๋ ํ ์ ์์
Cancellable์ถ๊ฐ
- Rx์์ disposeBag์ ์ญํ. ๋ฉ๋ชจ๋ฆฌ์์ ํด์ง
var coinSubscription: AnyCancellable?
- cancellable์ด ๋ช ํํ ํ๋์ผ ๊ฒฝ์ฐ ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ ์ธํด์ ์ฌ์ฉํ ์ ์์
var cancellables = Set<AnyCancellable>()
Initializer ์ ์
init() {
getCoints()
}
- ์ด๋์ ๋ผ์ด์ ์์ ํด๋น ๊ฐ์ฒด ์์ฑ์ ํธ์ถ๋ ํจ์๋ฅผ ์ง์ ํด ์ค
function to request data
guard let url = URL(string: "https://api.~~~~") else { return }
- api๋ฅผ ๋ฐ์์ฌ url์ด ์ ํจํ์ง ๊ฒ์ฆ. url์ ๋ฐ์ธ๋ฉ
coinSubscription = URLSession.shared.dataTaskPublisher(for: url)
- cancellable์ publisher๋ฅผ ๋๊ฒจ์ค.
- URLSession shared์ dataTaskPublisher๋ฅผ ์ฌ์ฉํด์ ํผ๋ธ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์
.subscribe(on: DispatchQueue.global(qos: .default))
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ๊ธฐ ์ํด ์ค๋ ๋ ์ ์. global default๋ก ์ค์ ํด์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ ํ๋๋ก ์ค์
.tryMap { (output) -> Data in
guard let response = output.response as? HTTPURLResponse,
response.statusCode >= 200 && response.statusCode < 300 else {
throw URLError(.badServerResponse)
}
return output.data
}
- tryMap์ ์ฌ์ฉํด์ ์ ์คํธ๋ฆผ ํผ๋ธ๋ฆฌ์ ๋ก ๋ถํฐ ์ ๋ฌ ๋ฐ์ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ณ Data๋ฅผ ๋ฐํํจ
.receive(on: DispatchQueue.main)
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ui์์ ์ฌ์ฉํ ์ ์๋๋ก main ์ค๋ ๋๋ก ๋ณ๊ฒฝ
.decode(type: [CoinModel].self, decoder: JSONDecoder())
- type์ Codable ๊ฐ์ฒด๋ฅผ ์ง์ ํด์ JSONDecodingํด์ค
.sink { completion in
switch completion {
case .finished:
break
case .failure(let error):
print(error.localizedDescription)
}
} receiveValue: { [weak self] returnedCoins in
self?.allCoins = returnedCoins
self?.coinSubscription?.cancel()
}
- ๋ฐฉ์ถ๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ . error๊ฐ ๋ฐ์ํ๋ฉด failure ์ผ์ด์ค๋ฅผ, ์ฑ๊ณตํ๋ฉด receiveValue์ ์ ๋ฌํ ํด๋ก์ ธ๋ฅผ ํ๊ฒ ๋จ
- ํด๋น ํด๋์ค์ ๊ฐํ์ฐธ์กฐ๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ weak self๋ก ์ฝํ ์ฐธ์กฐ๋ฅผ ๊ฑธ์ด์ค
- ํด๋น ํผ๋ธ๋ฆฌ์
๋ ๋ฐ์ดํฐ๋ฅผ 1ํ ๋ค์ด๋ก๋ ๋ฐ์ viewModel๋ก ์ ๋ฌํ ์ฉ๋์ด๋ฏ๋ก ์ต์ด 1ํ ํธ์ถ ํ ์ฌ์ฌ์ฉํ์ง ์์
๋ฐ๋ผ์ ํผ๋ธ๋ฆฌ์
๋ณ์์ ์ ๋ฌํ ๋ค cancellable์ธ coinSubscription์ cancel ํด์ค
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] Sticky Header ์คํฌ๋กค์ ๊ณ ์ ์ํค๊ธฐ (0) | 2022.12.17 |
---|---|
[SwiftUI] Model, ViewModel ์์ฑ (0) | 2022.12.17 |
[SwiftUI] NavigationView์์ ๋ค๋น๊ฒ์ด์ ๋ฐ ์จ๊ธฐ๊ธฐ (0) | 2022.11.17 |
[SwiftUI] PreviewProvider ์บ๋ฒ์ค์์ ๋คํฌ ๋ชจ๋ ๊ฐ์ด ๋ณด๊ธฐ (0) | 2022.11.17 |
[RxSwift] RxDataSources๋ก UITableView ์ ๋ฐ์ธ๋ฉ ํ๊ธฐ (0) | 2022.10.10 |
๋๊ธ