티스토리 뷰
Combine이 무엇이고 왜 쓰는지 알아봤으니 이제 어떻게 작동하는지 공부하려고 한다.
Combine의 핵심 개념은 3가지로 볼 수 있다.
- Publisher
- Subscriber
- Operators
여기에 추가로 cancellable과 subject 가 있다.
각각 어떻게 사용되는지 보자
Publisher
Publisher 는 그 이름처럼 데이터를 제공한다. 단 Subscriber의 요청이 없다면 데이터를 제공하지 않는다.
Publisher는 Output 타입과 Failure 타입으로 이루어져있다.
만약 Output 타입이 String이고 URLError를 리턴한다면, <String, URLError> 로 작성해주면 된다.
Subscriber
Subscriber는 Pubilsher에게 데이터를 요청(requestin) 하고 Publisher가 제공하는 데이터를 받는다.
Subscriber는 데이터 요청을 시작하고 수신하는 데이터의 양을 제어한다.
Subscriber는 Input 타입과 Failure 타입으로 이루어져 있다.
Publisher & Subscriber
Publisher 와 Subscriber는 연결되어야 한다.
Input - Output, Failure - Failure 의 형태로 연결된다.
Publisher 와 Subscriber가 어떻게 작동하는지 애플의 WWDC 2019 발표자료를 보자.
- 우선 Subscriber가 Publisher를 subcribe 한다.
- Publisher는 receive(subscription:) 을 통해 구독완료를 Subscriber에게 알린다.
- Subscriber가 request(_: Demand) 를 통해 데이터를 요청한다.
- Pubilsher가 reeice(_: Input) 을 통해 0개 이상의 데이터를 보낸다.
- 마지막으로 Publisher 가 receive(completion:) 을 보내 데이터 전송이 끝났거나 에러가 발생했음을 알린다.
completion
Publisher가 데이터를 다 보내고 나서 completion 을 보내 Subscriber에게 전송이 끝냈음을 알린다.
왜 굳이 끝냈음을 알릴까?
Combine은 비동기 코드이기 때문에 Main 쓰레드가 아닌 Background 쓰레드에서 작업을 처리한다.
Main 쓰레드는 1:1 과외, Background 쓰레드는 자습이라고 예시를 들어보자.
Main 쓰레드에서 하는 작업은 1:1 과외이기 때문에 선생님이 그 작업을 일일히 다 체크한다.
Background 쓰레드에서 하는 작업은 자습이기 때문에 혼자 작업을 처리해야한다. 그리고 작업이 완료되면 선생님에게 "저 끝났어요" 하고 알려주어야 한다.
단 모든 작업이 항상 성공적으로 끝나는 것은 아니다. 작업이 실패했을 수도 있기 때문에 finised 나 failure를 경우에 맞게 보내준다.
Operator
Operator는 값 또는 타입을 변환하는데 사용할 수 있다.
Operator는 Publisher와 Subscriber 두 개 모두 다처럼 동작한다.
배열에서 map 함수를 사용할 때를 생각해보자.
let array = [1,2,3,4,5]
array.map({
value in print(value)
})
위 코드에서 map 함수는 배열 타입에서 Int 타입으로 바꿔서 출력을 해준다.
Combine의 Operator도 이와 같다.
Publisher 가 보낸 데이터를 원하는 타입이나 값으로 변환하고 이를 다시 Suscriber로 보내준다.
Combine은 보통 네트워크에서 데이터를 받아올 때 사용한다.
네트워크에서 데이터를 받아오면 사용자가 지정한 구조체 형식으로 저장이 될 것이다.
그리고 그 구조체는 아마 배열에 넣어서 관리할 것이다.
struct downloadData{
...
}
@Published var myData: [downloadData] = []
Operator를 사용한다면 데이터를 가공해서 Subscriber 로 전달할 수 있는 것이다.
map, filter, max, min 등 여러 함수를 통해 Subscriber 는 원하는 형식으로 값을 받아 사용할 수 있다.
대부분 배열에서 사용해봤던 것이기 때문에 익숙할 것이다.
Cancellable
subscriber가 데이터를 request 하면 Publisher 는 계속해서 데이터를 보내준다. 그리고 마지막에 completion을 보낸다.
근데 중간에 subscriber가 데이터를 받고 싶지 않다면?
그 때 사용하는 것이 Cancellable 이다.
.cancel() 메소드 혹은 AnyCanecellable 타입의 인스턴스를 만들어 사용한다.
대부분은 AnyCancellable 타입 인스턴스를 만들어 사용하는 것 같다.
Subject
Subject는 Publisher의 종류 중 하나이다.
대신 얘는 .send() 메소드를 사용해 데이터를 Subscriber가 호출하는 곳, 외부에서도 보낼 수 있다.
Subscriber가 Publisher에게 데이터를 요청하면 Publisher는 데이터를 막~ 보내준다.
여기서 추가적으로 보내주고 싶은 데이터가 있으면 .send() 메소드를 사용하는 것 같다.
공식문서에 의거하면 "기존의 명령 코드를 Combine 모델에 적응시키는 데 유용할 수 있습니다." 라고 하는데 이 부분은 직접 코드를 작성해야지 더 이해가 될 것같다.
Subject는 여러 개의 Subscriber에게 값을 보낼 수 있다.Subject에 여러 개의 Subscriber가 연결되어 있다면 .send() 가 호출될 때 마다 여러 개의 Subscriber에게 값을 전달한다.
CurrentValueSubject 와 PassthroughSubject 를 작성해 사용한다.
참고한 사이트들https://developer.apple.com/videos/play/wwdc2019/722/https://heckj.github.io/swiftui-notes/#coreconcepts
Combine의 주요 개념과 동작 원리에 대해 정리해보았다.다음은 실제 코드를 통해 어떤 식으로 사용하는지 공부해야겠다.😄
'Swift > Swift 문법' 카테고리의 다른 글
Safari에서 WKWebView의 console 확인하기 - isInspectable 설정 (1) | 2023.10.12 |
---|---|
[Swift] Combine 3 - Combine 간단한 코드 예제 (0) | 2021.12.05 |
[Swift] Combine 1 - Combine은 무엇이고 왜 쓸까? (0) | 2021.12.04 |
- Total
- Today
- Yesterday
- swiftUI 기초
- 애플
- 부스트캠프iOS
- Swift 서버
- Swift공식문서
- 코딩테스트
- todo앱
- Combine
- 개발
- vapor
- 디자인 패턴
- 프로그래머스
- Swift
- UX
- TODO
- 책
- 날씨어플
- Swift DocC
- 필독서
- Swift 디자인 패턴
- Swift문법
- 코딩 테스트
- 부스트캠프
- SwiftUI
- 책후기
- ios
- 부스트캠프7기
- 책리뷰
- 앱개발
- 코딩
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |