Skip to content

Commit b6f026e

Browse files
committed
[Feat] #243 - FourthOnboardingView MVVM + Combine 적용
1 parent 594ad44 commit b6f026e

File tree

4 files changed

+51
-7
lines changed

4 files changed

+51
-7
lines changed

iOS-NOTTODO/iOS-NOTTODO/Coordinator/Factory/ViewControllerFactory.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ extension ViewControllerFactoryImpl {
8484
return viewController
8585
}
8686
func makeFourthOnboardingViewController(coordinator: AuthCoordinator) -> FourthOnboardingViewController {
87-
let viewController = FourthOnboardingViewController(coordinator: coordinator)
87+
let viewModel = FourthOnboardingViewModelImpl(coordinator: coordinator)
88+
let viewController = FourthOnboardingViewController(viewModel: viewModel)
8889
return viewController
8990
}
9091
func makeFifthOnboardingViewController(coordinator: AuthCoordinator) -> FifthOnboardingViewController {

iOS-NOTTODO/iOS-NOTTODO/Presentation/Onboarding/ViewControllers/FourthOnboardingViewController.swift

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import UIKit
99

10+
import Combine
1011
import SnapKit
1112
import Then
1213

@@ -20,7 +21,11 @@ final class FourthOnboardingViewController: UIViewController {
2021
private let onboardingModel: [FourthOnboardingModel] = FourthOnboardingModel.items
2122
private var dataSource: UICollectionViewDiffableDataSource<Section, FourthOnboardingModel>! = nil
2223
private lazy var safeArea = self.view.safeAreaLayoutGuide
23-
private weak var coordinator: AuthCoordinator?
24+
25+
private let viewModel: any FourthOnboardingViewModel
26+
private var cancelBag = Set<AnyCancellable>()
27+
28+
private let buttonDidTapped = PassthroughSubject<Void, Never>()
2429

2530
// MARK: - UI Components
2631

@@ -30,8 +35,8 @@ final class FourthOnboardingViewController: UIViewController {
3035

3136
// MARK: - init
3237

33-
init(coordinator: AuthCoordinator) {
34-
self.coordinator = coordinator
38+
init(viewModel: some FourthOnboardingViewModel) {
39+
self.viewModel = viewModel
3540
super.init(nibName: nil, bundle: nil)
3641
}
3742

@@ -49,6 +54,7 @@ final class FourthOnboardingViewController: UIViewController {
4954
setLayout()
5055
setupDataSource()
5156
reloadData()
57+
setBindings()
5258
}
5359
}
5460

@@ -59,6 +65,7 @@ extension FourthOnboardingViewController {
5965
collectionView.register(SubOnboardingCollectionViewCell.self, forCellWithReuseIdentifier: SubOnboardingCollectionViewCell.identifier)
6066
collectionView.register(OnboardingHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: OnboardingHeaderView.identifier)
6167
}
68+
6269
private func setUI() {
6370
view.backgroundColor = .ntdBlack
6471

@@ -67,6 +74,7 @@ extension FourthOnboardingViewController {
6774
$0.bounces = false
6875
$0.isScrollEnabled = false
6976
}
77+
7078
nextButton.do {
7179
$0.configuration?.image = .splashBack
7280
$0.configuration?.title = I18N.fourthButton
@@ -137,12 +145,19 @@ extension FourthOnboardingViewController {
137145
let layout = UICollectionViewCompositionalLayout(section: section)
138146
return layout
139147
}
148+
149+
private func setBindings() {
150+
let input = FourthOnboardingViewModelInput(
151+
buttonDidTapped: buttonDidTapped
152+
)
153+
_ = viewModel.transform(input: input)
154+
}
140155
}
141156
extension FourthOnboardingViewController {
142157
@objc
143158
private func buttonTapped() {
144159
AmplitudeAnalyticsService.shared.send(event: AnalyticsEvent.OnboardingClick.clickOnboardingNext4)
145160

146-
self.coordinator?.showFifthOnboardingViewController()
161+
self.buttonDidTapped.send()
147162
}
148163
}

iOS-NOTTODO/iOS-NOTTODO/Presentation/Onboarding/ViewModel/FourthOnboardingViewModel.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,12 @@
55
// Created by 강윤서 on 3/14/24.
66
//
77

8-
import Foundation
8+
import Combine
9+
10+
protocol FourthOnboardingViewModel: ViewModel where Input == FourthOnboardingViewModelInput, Output == FourthOnboardingViewModelOutput {}
11+
12+
struct FourthOnboardingViewModelInput {
13+
let buttonDidTapped: PassthroughSubject<Void, Never>
14+
}
15+
16+
struct FourthOnboardingViewModelOutput {}

iOS-NOTTODO/iOS-NOTTODO/Presentation/Onboarding/ViewModel/FourthOnboardingViewModelImpl.swift

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,24 @@
55
// Created by 강윤서 on 3/14/24.
66
//
77

8-
import Foundation
8+
import Combine
9+
10+
final class FourthOnboardingViewModelImpl: FourthOnboardingViewModel {
11+
12+
private weak var coordinator: AuthCoordinator?
13+
private var cancelBag = Set<AnyCancellable>()
14+
15+
init(coordinator: AuthCoordinator) {
16+
self.coordinator = coordinator
17+
}
18+
19+
func transform(input: FourthOnboardingViewModelInput) -> FourthOnboardingViewModelOutput {
20+
input.buttonDidTapped
21+
.sink { [weak self] _ in
22+
guard let self else { return }
23+
self.coordinator?.showFifthOnboardingViewController()
24+
}
25+
.store(in: &cancelBag)
26+
return FourthOnboardingViewModelOutput()
27+
}
28+
}

0 commit comments

Comments
 (0)