Skip to content

Commit 8a12019

Browse files
committed
refactor: MainViewCoordinator 하위 화면 ViewModel 보관 방식 단순화
MainViewCoordinator가 생성하는 하위 화면 ViewModel을 단일 인스턴스 기준으로 보관하도록 변경 - TodoListViewModel은 현재 category와 일치할 때 기존 인스턴스 재사용 - TodoDetailViewModel은 현재 todoId와 showEditButton 조건이 일치할 때 기존 인스턴스 재사용 - category별 dictionary와 todoId별 dictionary 제거 - ViewModel이 가진 생성 기준 값을 재사용 조건으로 활용하여 코디네이터의 별도 key 상태 제거 - compact/regular 전환으로 같은 하위 화면이 재생성될 때 기존 ViewModel 인스턴스를 유지하는 구조
1 parent 451341e commit 8a12019

3 files changed

Lines changed: 14 additions & 16 deletions

File tree

DevLog/Presentation/ViewModel/TodoDetailViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ final class TodoDetailViewModel: Store {
4040
}
4141

4242
private(set) var state: State = .init()
43+
let todoId: String
4344
let showEditButton: Bool
4445
private let fetchTodoUseCase: FetchTodoByIdUseCase
4546
private let fetchReferenceItemsUseCase: FetchReferenceItemsUseCase
4647
private let upsertUseCase: UpsertTodoUseCase
47-
private let todoId: String
4848
private let loadingState = LoadingState()
4949

5050
init(

DevLog/Presentation/ViewModel/TodoListViewModel.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ final class TodoListViewModel: Store {
114114

115115
let searchResultsLimit = 5
116116

117+
var category: TodoCategory {
118+
state.category
119+
}
120+
117121
var appliedFilterCount: Int {
118122
var count = 0
119123
if state.query.sortTarget != .createdAt { count += 1 }

DevLog/UI/Main/MainViewCoordinator.swift

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ final class MainViewCoordinator {
1616
var todoIdToPresent: TodoIdItem?
1717
private let diContainer: DIContainer
1818
@ObservationIgnored
19-
private var todoListViewModels = [TodoCategory: TodoListViewModel]()
19+
private var todoListViewModel: TodoListViewModel?
2020
@ObservationIgnored
21-
private var todoDetailViewModels = [TodoDetailViewModelKey: TodoDetailViewModel]()
21+
private var todoDetailViewModel: TodoDetailViewModel?
2222

2323
init(container: DIContainer) {
2424
self.diContainer = container
@@ -44,7 +44,8 @@ final class MainViewCoordinator {
4444
}
4545

4646
func todoListViewModel(category: TodoCategory) -> TodoListViewModel {
47-
if let todoListViewModel = todoListViewModels[category] {
47+
if let todoListViewModel,
48+
todoListViewModel.category == category {
4849
return todoListViewModel
4950
}
5051

@@ -56,19 +57,17 @@ final class MainViewCoordinator {
5657
undoDeleteTodoUseCase: diContainer.resolve(UndoDeleteTodoUseCase.self),
5758
category: category
5859
)
59-
todoListViewModels[category] = todoListViewModel
60+
self.todoListViewModel = todoListViewModel
6061
return todoListViewModel
6162
}
6263

6364
func todoDetailViewModel(
6465
todoId: String,
6566
showEditButton: Bool = true
6667
) -> TodoDetailViewModel {
67-
let todoDetailViewModelKey = TodoDetailViewModelKey(
68-
todoId: todoId,
69-
showEditButton: showEditButton
70-
)
71-
if let todoDetailViewModel = todoDetailViewModels[todoDetailViewModelKey] {
68+
if let todoDetailViewModel,
69+
todoDetailViewModel.todoId == todoId,
70+
todoDetailViewModel.showEditButton == showEditButton {
7271
return todoDetailViewModel
7372
}
7473

@@ -79,12 +78,7 @@ final class MainViewCoordinator {
7978
todoId: todoId,
8079
showEditButton: showEditButton
8180
)
82-
todoDetailViewModels[todoDetailViewModelKey] = todoDetailViewModel
81+
self.todoDetailViewModel = todoDetailViewModel
8382
return todoDetailViewModel
8483
}
85-
86-
private struct TodoDetailViewModelKey: Hashable {
87-
let todoId: String
88-
let showEditButton: Bool
89-
}
9084
}

0 commit comments

Comments
 (0)