Publisher(게시자)
- 요청 시 데이터를 제공해줌
- 구독이 없는 경우 Publisher는 데이터를 제공하지 않음
- 두 가지 유형을 제공함(Outpt Type, Failure Type)
Subscriber(구독자)
- 구독자는 데이터를 요청하고 Publisher가 제공한 데이터(및 오류)를 처리해야 함
- 입력에 대한 유형과 실패에 대한 유형 두 가지 연관된 유형
- 구독자는 데이터를 요청을 시작하고 수신하는 데이터의 양을 제어함
- Subscriber가 없으면 게시가 아예 되지 않기 때문에 Subscriber는 작업을 주도하는 것으로 생각할 수 있습니다.
Operator(연산자)
- 연산자는 Publisher Protocol과 Subscriber Protocol을 모두 채택하는 클래스
- 게시자 구독 및 모든 구독자에게 결과 보내기를 지원
- 게시자가 데이터를 제공하고 구독자가 요청한 데이터를 처리, 반응 및 변환하기 위해 체인을 만들 수 있음
연산자는 값 또는 유형을 변환하는데 사용되며 스트림을 분할 또는 복제하거나 스트림을 병합할 수도 있습니다. 그리고 항상 (출력/실패) 유형의 조합으로 정렬되어야 합니다. 만약 유형이 올바르지 않으면 컴파일러에서 오류가 발생합니다!
아래는 간단한 Combine 파이프라인 입니다.
let _ = Just(5) // 1
.map { value -> String in // 2
return "a string"
}
.sink { receivedValue in // 3
print("The end result was \(receivedValue)")
}
1) Just 파이프라인은 정의되어있는 값으로 응답하는 게시자입니다. 이미 정의되어있는 값이기 때문에 실패 유형이 없죠? 그래서 Error 유형은 NEVER가 됩니다.
2) map을 통해 기존의 값을 기반으로 한 새로운 유형의 값을 반환할 수 있습니다. 예제에서는 기존 값을 무시하고 새로운 String 값을 반환합니다.
3) sink 구독자로 인해 파이프라인이 종료됩니다.
파이프라인은 출력 유형과 실패 유형 두 가지에 의해 연결된 일련의 작업입니다. 파이프라인을 생성할 때 최종 목표를 달성하기 위해 데이터, 유형(스트림의 성공 여부 등)을 변환하는 데 연산자를 사용하게 됩니다. 여기서 말하는 최종 목표는 대부분 사용자 인터페이스 요소를 변화시키는 작업이겠죠? 그렇기에 이러한 변환을 돕기 위한 게 바로 Combine의 연산자입니다.
Combine의 대표 연산자 tryMap
Combine의 연산자를 보다 보면 try###라는 이름의 연산자들이 있습니다. 모두 기존의 함수와 비슷한 동작을 하지만 실패 유형을 가지고 있어 실패 유형에 대한 처리를 도와줍니다. map은 위의 예제에서처럼 String만을 반환하지만 tryMap의 경우 유형을 제공하는 게시자를 <String, Never>을 사용하는 구독자로 끝납니다. 간단하게 throw를 해야 한다면 try가 붙은 연산자를 사용하면 됩니다.
let _ = Just(5)
.map { value -> String in
switch value {
case _ where value < 1:
return "none"
case _ where value == 1:
return "one"
case _ where value == 2:
return "couple"
case _ where value == 3:
return "few"
case _ where value > 8:
return "many"
default:
return "some"
}
}
.sink { receivedValue in
print("The end result was \(receivedValue)")
}
- Just<Int, Never> 유형의 조합을 만들었고 정의된 단일 값을 제공합니다.
- .map() 함수를 통해 Int를 받아 String으로 반환합니다. 실패 유형인 Never는 변경되지 않으므로 통과됩니다.
- sink를 통해 <String, Never> 조합을 수신합니다.
'ios > Combine' 카테고리의 다른 글
Swift - Combine의 Publisher 알아보기 Just, Future, Fail, Empty, Deferred, Sequence (0) | 2022.02.08 |
---|---|
Swift - Combine 요약 (Publisher, Operator 종류) (0) | 2022.02.04 |
SwiftUI - Combine (3) Combine의 생명 주기(Life Cycle) (0) | 2022.01.21 |
SwiftUI - Combine (1) 소개 Combine을 사용하는 이유 (0) | 2022.01.18 |