‘The Combine framework provides a declarative approach for how your app processes events.’
앱에서 일어나는 이벤트에 선언적 접근을 제공하는 프레임워크라고 한다.
무슨 뜻인지 바로 와닿지 않는다.
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
이 출력된다.
그렇다면, 일반적으로 위와같은 비동기 프로그래밍을 할 때 발생하는 문제를 해결하기 위해서는 어떤 매커니즘이 있을까?
위와 같이 총 네개의 매커니즘으로 비동기 코드를 처리한다.
각각은 장, 단점이 있는데 먼저 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이다!