TCA를 사용하다가 실수한 케이스를 포스팅 해보겠습니다.
TCA 예제에 보면 IdentifiedArray의 원소 중에 특정 조건을 만족하는 원소들만을 View에 보여주기 위해서 고차함수 filter와 computed property를 사용하는 아래와 같은 코드가 있습니다.
하위 View에서의 action을 모두 인식하고 state가 변환되는 경우에도 View가 갱신되는 것을 볼 수 있습니다.
var filteredTodos: IdentifiedArrayOf<Todo.State> {
switch filter {
case .active: return self.todos.filter { !$0.isComplete }
case .all: return self.todos
case .completed: return self.todos.filter(\.isComplete)
}
}
List {
ForEachStore(
self.store.scope(state: \.filteredTodos, action: Todos.Action.todo(id:action:))
) {
TodoView(store: $0)
}
}
하지만 아래처럼 computed property 안에서 완전히 새로운 IdentifiedArray를 만들어서 전달하는 경우 문제가 발생할 수 있습니다.
var filteredTodos: IdentifiedArrayOf<Todo.State> {
switch filter {
case .active: return self.todos.filter { !$0.isComplete }
case .all: return self.todos
case .completed:
return IdentifiedArray(uniqueElements:
self.todos
.map { }
.filter(\.isComplete)
)
}
}
아직 TCA의 내부 구현을 완전히 파악을 하지는 못했지만 제가 생각한 원인은 이렇습니다. 좀 더 공부해보고 틀렸으면 수정하겠습니다. 일단 저렇게 하면 안된다는 것만 알아주세요~^^
기존의 MVVM의 프로젝트를 TCA로 변환하는 작업 중에 마주친 버그입니다. TCA는 제가 MVVM을 하면서 고민한 수많은 아키텍쳐에 관한 고민을 해결해주는 동시에 새로운 고민을 던져주었습니다.
시간을 내서 TCA에 대한 경험을 더 포스팅 해보도록 하겠습니다.