iOS

combine - 1. Combine에 관하여

728x90

Combine 이란?

combine은 뭐지, 왜 쓰는 걸까?

Combine은 시간의 흐름에 따라 발생하는 이벤트를 처리하기 위한 API 이다.

시간의 흐름이란 의미가 모호한데, 클릭 이벤트나 데이터를 호출하는 것과 같은 비동기 요청이 어떻게 실행 되는지 알아야한다.

비동기 요청이 실행되기전, 완료 된 후 등과 같은 시점을 시간의 흐름이라고 생각하겠다.

즉, 비동기 요청이 발생 했을 때 실행되기전, 완료 된 후 등과 같은 시점을 처리하기 위한 API 이다.

근데, 특이한 점이 요청이 발생하고 완료 되었을 때 요청을 원했던 모든 구독자들 에게 영향을 끼칠 수 가 있다.

그러니까 예를들면, 유튜버가 영상을 하나 올리면(=비동기요청) 유튜브를 구독한 모든 사람들에게 알림을 주는 느낌이다.

combine을 사용하면, data가 변경되었을 때 UI를 일일히 변경하지 않아도 된다. 이런 행위를 “reactive” 라고 한다. 어쩌면 이게 핵심 아닐까.. 너무 편할 듯..

(보일러 플레이트도 줄어 든다고 함.. 하나 하나 ui에 값을 넣어주는 행위가 없어지니까 그런가봄)

개념

  • 비동기 요청 관리하는 API
  • Reactive한 API

combine에 대해 알 수 있는 wwdc 영상이 있어 링크를 걸어둡니다.

Combine in Practice - WWDC19 - Videos - Apple Developer

 

Combine in Practice - WWDC19 - Videos - Apple Developer

Expand your knowledge of Combine, Apple's new unified, declarative framework for processing values over time. Learn about how to...

developer.apple.com


Combine을 구성하는 것들

위의 영상에도 나오는데, Combine은 크게 3가지로 구성된다.

  • Publisher
  • Operator
  • Subscriber

https://medium.com/harrythegreat/swift-combine-%EC%9E%85%EB%AC%B8%ED%95%98%EA%B8%B0-%EA%B0%80%EC%9D%B4%EB%93%9C-1-525ccb94af57

Publisher을 통해 데이터를 전달하고, 중간 Operator에서 이벤트를 가공하고 subscriber에게 데이터를 전달하게 된다. 코드를 보면 좀 더 이해가 잘된다.

Just(5)
    .map{ value -> String in
        print("Value is \\(value)") // "Value is 5\\n"
        return "\\(value)"          // "5"
    }
    .sink { data in
        print(data)           // "5"
        print(type(of: data)) // String
    }

Just(5) : Publisher로 Apple에서 제공해주는 Publisher 이다. 단일 값을 반환하고 에러 같은 걸 반환 할 때 사용하는 것같다.

.map { } : Operator 부분으로 subscriber에게 값이 전달되기전 데이터를 가공 할 수 있다. 위의 예제에선 String형으로 데이터를 변환했다.

.sink : Subscriber로 Apple에서 제공해수는 Subscriber이다. Publisher→ Operator을 거쳐 전달된 값을 받는다.

 

Publisher와 Subscriber

Publisher, Subscriber 내부를 열어보면 위 사진처럼 되어있다.

  • Publisher는 전달할 데이터 Output, 실패와 관련된 Failure가 있다.
  • Subscriber는 데이터를 받을수 있는 Input, 실패와 관련된 Failure가 있다.
  • Ouput과 Input 타입은 같아야 된다고 한다.

그냥 이렇게 있나보다 하고 넘어가면 된다. 내부는 이렇게 생겼다.

Publisher

protocol Publisher {
	associatedtype Output
  associatedtype Failure: Error

	func subscribe<S: Subscriber>(_ subscriber: S) 
		where S.Input == Output, S.Failure == Failure	
}

Subscriber

protocol Subscriber {
	associatedtype Input
  associatedtype Failure: Error

	func receive(subscription: Subscription)
	func receive(_ value: Subscribers.Demand)
	func receive(completion: Subscribers.Completion<Failure>)
}

 

Publihser와 Subscriber 동작 방식

 

 

[Combine] Subscribe

구독하기🕵🏻‍♀️

sujinnaljin.medium.com

이 블로그에서 자세히 설명해주고 있다. 캡쳐 해오면 아래랑 같은데 이것도 그냥 그런가 보다 저렇게 하네 하면 될 것 같다. Publisher, Subscriber을 만들일이 있을 때 더 자세히 보면 될 것 같다.

대충 Publisher - subscription 생성 → subscription에서 Subscriber에게 전달 끝.

참고

반응형