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
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에게 전달 끝.
참고
- 공식홈: https://developer.apple.com/documentation/combine
- publisher, subscriber 사진 및 설명 : https://brunch.co.kr/@tilltue/66
- 예제 및 설명 잘되어있음: https://medium.com/harrythegreat/swift-combine-입문하기3-네트워크요청-f36d6a32af14
- https://medium.com/harrythegreat/swift-combine-입문하기-가이드-1-525ccb94af57
- https://sujinnaljin.medium.com/combine-subject-a974340cb582
'iOS' 카테고리의 다른 글
Combine - Operator(map, compactMap, tryMap) (0) | 2022.04.19 |
---|---|
combine - 2. Network 예제 살펴보기 (0) | 2022.04.18 |
iOS 동시성 (GCD Grand Central Dispatch) 기본 개념 (0) | 2022.02.07 |
3. View의 생명주기 (LifeCycle) (0) | 2022.02.04 |
2. View에 관하여 (Frame, Bounds) (0) | 2022.02.04 |