꿈돌이랜드

[번역] Clean Swift 패턴에서 Reactiveness가 필요없는 이유 본문

Programming/디자인패턴

[번역] Clean Swift 패턴에서 Reactiveness가 필요없는 이유

loinsir 2024. 1. 9. 03:40
반응형

How to add reactive-ness to Clean Swift - Clean Swift
I answered different forms of this same questions many times in emails, comments, and my mentorship program. I understand why people ask this question. They’ve seen MVVM, ReactiveCocoa, RxSwift, and want to see if Clean Swift can handle this model-view update automatically. My answer is always the same. You don’t need it. You don’t need...
https://clean-swift.com/add-reactive-ness-clean-swift/

이 글은 위 글의 번역입니다.

Clean Swift에 반응성(reactiveness)를 추가하는 법?

나는 이메일, 댓글, 멘토링 프로그램을 통해 이와 같은 질문에 대해 다양한 형태로 여러번 답변했습니다.

사람들이 왜 이런 질문을 하는지 이해합니다. 그들은 MVVM, ReactiveCococa, RxSwift를 경험했고, Clean Swift가 이 Model, View 업데이트를 자동으로 처리할 수 있는지 알고 싶기 때문입니다.

내 답변은 항상 같습니다. 당신은 그것들이 필요하지 않습니다. 간단한 작업을 수행하기 위해 또다른 종속성을 추가할 필요는 없습니다.

interactor가 presenter의 메서드를 여러 번 호출하거나 여러 개를 호출할 수 있기 때문입니다.

아래는 내 멘토십 프로그램의 토론에서 직접 가져온 것입니다.

다양한 성공/실패 조건에 대한 여러 presenter 메서드 호출

당신이 몇가지 비동기 작업을 수행할 때, 때때로 사용자에게 loading status를 표시해야 합니다.

당신은 loading status를 표시하기 위해 비동기 작업을 VC가 interactor를 통해 호출하면서 VC 자신을 변경하는 것을 선호하시나요? 아니면 interactor가 start loading 메시지를 비동기 작업을 시작할 때 presenter에 보내어 처리하는 것을 선호하시나요?

저는 지금까지 두번째 옵션으로 구현해 왔지만, 하나의 interactor usecase가 2,3 개 이상의 다른 presenter usecase를 사용하는 경우가 발생했습니다.

네, 당신 말이 맞습니다. VIP 구성 요소 간의 UseCase에는 엄격한 1:1 관계가 없습니다. 그것은 유연하며, 당신은 그것을 어떻게 분해하고 싶은지 제어할 수 있습니다.

예를 들어 다음과 같이 사용할 수 있습니다.

func fetchPosts(request: Feed.FetchPosts.Request)
{
  postsWorker.fetchPosts { (posts, progress, done, error) -> Void in
    if done {
      let response = Feed.FetchPosts.Response(posts: posts)
      self.presenter?.presentFetchedPosts(response: response)
    } else if error == nil {
      let response = Feed.FetchPosts.Response(progress: progress)
      self.presenter?.presentFetchProgress(response: response)
    } else {
      let response = Feed.FetchPosts.Response(error: error)
      self.presenter?.presentFetchError(response: response)
    }
  }
  let response = Feed.FetchPosts.Response(progress: progress)
  presenter?.presentFetchProgress(response: response)
}

나는 비동기 작업의 시작 이후와 함수가 리턴되기 전에 presenterFetchProgress(response:) 를 즉시 호출하여 start loading message를 표시합니다.

또한 worker가 지원하는 한, 진행 상황을 표시하기 위해 presentFetchProgress(response:)를 호출했습니다.

완료되면 게시물 목록 형식을 지정하기 위해 presentFetchedPosts(response:)를 호출합니다.

오류가 있으면 presentFetchError(response:)를 호출하여 사용자에게 알립니다.

따라서 1개의 interactor 메서드는 잠재적으로 4개의 presenter / viewcontroller 메서드를 호출할 수 있습니다. 이는 각 상황에 맞게 분류하는 매우 좋은 방법입니다. 특히 다양한 조건을 처리하기 위해 수행해야 할 작업이 많습니다.

또는 presenter / viewcontroller 메서드를 하나만 가질 수도 있습니다. 하지만 그러면 하나의 함수에서 모든 경우를 처리해야 합니다.

어떻게 디자인할지는 전적으로 당신에게 달려있습니다 :)

요약

  • CleanSwift 패턴은 Rx, Cocoa와 같은 반응형 라이브러리가 필요하지 않다.
  • interactor가 presenter의 메서드를 여러개, 여러번 유연하게 호출할 수 있기 때문에, 모델, 뷰 간의 reactiveness가 아키텍처 단에서 가능해진다.
    • Reactiveness: 반응성. 데이터의 변화에 따라 동작이 실행되는 것을 말한다.

Uploaded by N2T

반응형