티스토리 뷰

반응형

 

 

iOS의 상태관리 기반 단방향 아키텍쳐인 TCA(The Composable Architecture)는 View에서 이벤트가 발생할때 ObservableObject 프로토콜을 준수하는 ViewStore에서 특정 이벤트에 대한 Action을 send 하고 이를 Reducer에서 처리하게 됩니다.

Reducer에서는 이후 이벤트 처리를 위해 Effect를 반환하는데요. 이 Effect는 Combine framework의 Publisher로 되어있습니다. 다양한 Combine Opeartor를 사용할 수도 있는데요. Publisher를 구독하고 메모리 해제하는 코드는 어디에 있는지, 어떤식으로 돌아가고 있을지 보겠습니다.

먼저, iOS TCA가 이벤트 발생을 할때 어떤식으로 동작하는지 간단하게 알고 싶으싣다면, 먼저 아래 포스팅을 먼저 보신 뒤 보셔도 좋을 것 같습니다. 그럼 바로 코드로 보겠습니다.

 

iOS TCA, 이벤트 발생 시 Action, State, Reducer 동작과정

TCA는 Point-free에서 제안한 아키텍쳐로 The Composable Architecture라고 하며, Store의 State 변화에 따라 View를 업데이트해주는 상태 기반의 단방향 아키텍쳐입니다. 저는 개인적으로 개발한 앱에 TCA를 도

0urtrees.tistory.com

 

 


iOS TCA의 Publisher, Effect는 어디서 구독하고 관리될까?

위 코드는 Store의 구현부입니다. 여기에서 보면 Publisher 구독 관리에 사용되는 Cancellables 변수를 사용하는 멤버가 하나 있습니다. UUID를 키로, AnyCancellable을 값으로 가진 딕셔너리로 되어있습니다.

* View에서 특정 Action 이벤트를 전송(send)하면 Reducer는 Action에 맞게 State를 수정하고, Effect타입을 반환하는데, Effect는 구독이 가능한 Publisher 타입으로 되어있습니다.

이어서 Store가 View에서 WithViewStore로 변환되어 나오는 ViewStore의 코드를 보겠습니다.

 

 


ViewStore에서 Action을 sned했을때 호출되는 클로져

ViewStore의 멤버로 _send 라는 클로져가 있습니다. Action을 받아서 처리하는 클로져 타입으로 되어있는데요. ViewStore의 생성자 구현부를 보시면, 75번째 행에 _send 클로져를 Store의 send 메서드 호출 클로져로 설정하며 참조하고 있습니다.

* Store, ViewStore는 상속이 불가한 final class 타입으로 정의되어 있습니다. (+ ViewStore는 ObservableObject 프로토콜도 채택하고 있음)

 

 

이제 우리가 View에서 이벤트를 처리할때 자주 사용하는 코드입니다. ViewStore의 send 메서드를 보시면, 앞서 Store의 send 클로져를 참조하는 _send 클로져에 action을 넣어서 실행하는 것을 보실 수 있습니다. 이렇게 실행되는 코드는 Store의 send 메서드를 실행하게 됩니다. 이어서 Store의 send 메서드 쪽을 가보겠습니다.

* ObservableObject를 따르는 ViewStore는 thread safe 하지 않으므로 Action을 send할때 반드시 main thread에서 동작해야 합니다. 만약 main thread에서 동작하기에 작업량이 너무 크다고 생각된다면, background thread에서 실행되고, 그 결과를 Store에게 전달해줄 수 있는 Effect를 활용하는게 좋습니다.

 

 


Store의 send 메서드, Effect 구독 전 메인 스레드에서 동작하는지 확인한다.

Store의 send 메서드 구현부입니다. 먼저 스레드 체크를 하고 있는데요. View의 업데이트와 직접적인 연관을 가진 Effect가 반환될 때에는 반드시 메인스레드에서 동작해야해요. 안그러면 스레드 체크 과정에서 경고문구를 보여주게 됩니다.

이어서 보시면 effect를 구독하고, 구독을 하며 사용하는 클로져인 receiveCompletion, receiveValue를 통해 이벤트를 감지하고 있습니다. completion 이벤트가 떨어지지 않는다면, 아래 effectCancellables에서 구독 정보를 갖고 있게 됩니다.

실제 TCA로 동작하는 제 개인앱을 통해 ViewStore에서 Action을 전송해보겠습니다. 

 

 


Effect Publisher의 구독과 구독해지가 이루어지는 곳

이벤트가 발생하면, effectAction이라는 이름으로 send 된 Action이 들어옵니다. 그리고 originatingFrom에서는 그 이전 이벤트였던 scenePhaseEvent가 나오네요.

 

 

이제 필요없는 Effect는 completion으로 내려오고, effectCancellables 딕셔너리에서 관련 정보를 제거합니다.

 

 

그리고 사용하는 Effect의 구독 정보는 다시 effectCancellables 딕셔너리에 저장을하고.... 필요없으면 끝내고 해제하고.... 반복하면서 구독정보가 관리 됩니다.

 

 

이번에는 originatingFrom에 있는 이벤트가 connectWebSocket이고, 이후 발생한 이벤트, updateWebSocket이 effectAction에 있네요. 이렇게 순환을 돌면서 effectCancellables 딕셔너리에 구독정보를 저장하고, 필요없으면 제거하고 반복하면서 관리되어집니다.

 

 


오늘은 TCA(The Composable Architecture) 관련하여 View에서 Action이 전송될때 발생되는 구독이벤트와 구독해제 방식에 관련해서 내부 코드를 참고하며 알아봤습니다. 또한 ViewStore가 Store에서 변환된 만큼 Store 관련 정보를 참조하고 있으며 밀접한 연관을 갖고 있음을 알 수 있었습니다.

제 설명이 부족할 수 있습니다. 관련하여 의견이나 질문 있으시다면 언제든 댓글 부탁드립니다. 감사합니다~ 😁

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함