Combine - Asynchronous Programming with Swift 읽기 - (1)

Modyhoon·2021년 12월 31일
0

Combine이란?

‘The Combine framework provides a declarative approach for how your app processes events.’

앱에서 일어나는 이벤트에 선언적 접근을 제공하는 프레임워크라고 한다.

무슨 뜻인지 바로 와닿지 않는다.

  • 여러 개의 delegate callback이나 completion handler를 사용하는 대신에,
  • 이벤트 소스의 체인을 만들 수 있다.
    • 이게 핵심인것 같다.

비동기 프로그래밍

  • Combine에 본격적으로 접근하기 전에, 비동기 프로그래밍에 대해 알아보자.
  • 일반적으로 하나의 스레드를 사용하는 경우, line-by-line으로 코드는 실행된다.
begin
  var name = "Tom"
  print(name)
  name += " Harding"
  print(name)
end

위의 실행결과는 반드시 Tom Harding 이 된다.

그렇다면, 여러 스레드를 사용하는 경우 예시는 어떨까?

--- Thread 1 ---
begin
  var name = "Tom"
  print(name)

--- Thread 2 ---
name = "Billy Bob"

--- Thread 1 ---
  name += " Harding"
  print(name)
end

위와같이 두 개의 스레드가 있다고 가정하자.
위의 경우 스레드 2와 스레드 1의 실행이 concurrently하게 일어나므로,
어쩔 때는 Tom Billy Bob 이, 어쩔때는 Tom Harding 이 출력된다.

그렇다면, 일반적으로 위와같은 비동기 프로그래밍을 할 때 발생하는 문제를 해결하기 위해서는 어떤 매커니즘이 있을까?

  1. NotificationCenter
  2. Delegate Pattern
  3. GCD and Operations
  4. Closures

위와 같이 총 네개의 매커니즘으로 비동기 코드를 처리한다.
각각은 장, 단점이 있는데 먼저 NotificationCenter 먼저 보면
NotificationCenter는 기본적으로 1:N 방식으로 observer pattern을 추상화하여 더 간편하게 사용할 수 있는 방식이다.
하지만 코드 관리가 힘들다는 단점이 있고, 일반적으로 특정 상황(기기 회전, 키보드 보이기 숨기기 등) 에 쓰인다는 특징이 있다.

Delegate Pattern의 경우 실제로 수행하는 객체에게 할일을 위임하는 방식인데, AppDelegate로 예시를 들어보면 remote notification이 도달하면 그런 이벤트가 언제 실행될지, 그리고 얼마나 실행될지 모른다는 점이 있다. -> 자세히 무슨 뜻인지 모르겠다. delegate의 method를 호출하는 count를 세면 되는거 아닌가?

Grand Central Dispatch(GCD) 와 Operation의 경우 작업의 단위를 추상화 할 수 있다는 특징이 있다. 각 작업을 우선순위를 매길 수 있고, serial 혹은 concurrent하게 작업을 수행할수도 있다. 작업을 스케쥴링 한다는 점이다.

Closure는 특정 코드가 처리된 시점에 다음 동작을 정의할 수 있게 매개변수로 Completion Closure를 넘겨주는것을 의미하는데, 함수에 엮어서 사용되기 때문에 실행 될지 안될지를 결정할 수 있고, 얼마나 실행되는지 파악이 가능하다. -> Delegate랑 차이점은 무엇일까?

위와같은 기존 방식들로 비동기 코드를 짜게 되면 앱 전체적으로 봤을 때 순서가 어떻게 될지 추정하기 어렵다는 점이 있다.

그럼에도 좋은 비동기 코드를 짜는 방법이 있긴 한데,,, 너무 복잡하고 재사용성이 낮다는 특징이 있다.

이걸 해결하기 위해 나온게? 반응형 프로그래밍 및 애플의 Combine이다!

profile
어제보다 나은 오늘

0개의 댓글