티스토리 뷰

Swift/Swift 문법

[Swift] Combine 2 - Combine 원리

말차프라푸치노 2021. 12. 5. 14:26

Combine이 무엇이고 왜 쓰는지 알아봤으니 이제 어떻게 작동하는지 공부하려고 한다.

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 발표자료를 보자.

출처 : Developer Apple

  1. 우선 Subscriber가 Publisher를 subcribe 한다.
  2. Publisher는 receive(subscription:) 을 통해 구독완료를 Subscriber에게 알린다.
  3. Subscriber가 request(_: Demand) 를 통해 데이터를 요청한다.
  4. Pubilsher가 reeice(_: Input) 을 통해 0개 이상의 데이터를 보낸다.
  5. 마지막으로 Publisher 가 receive(completion:) 을 보내 데이터 전송이 끝났거나 에러가 발생했음을 알린다.

 

completion

Publisher가 데이터를 다 보내고 나서 completion 을 보내 Subscriber에게 전송이 끝냈음을 알린다.

왜 굳이 끝냈음을 알릴까?

Combine은 비동기 코드이기 때문에 Main 쓰레드가 아닌 Background 쓰레드에서 작업을 처리한다.

 

Main 쓰레드는 1:1 과외, Background 쓰레드는 자습이라고 예시를 들어보자.

Main 쓰레드에서 하는 작업은 1:1 과외이기 때문에 선생님이 그 작업을 일일히 다 체크한다.

Background 쓰레드에서 하는 작업은 자습이기 때문에 혼자 작업을 처리해야한다. 그리고 작업이 완료되면 선생님에게 "저 끝났어요" 하고 알려주어야 한다. 

단 모든 작업이 항상 성공적으로 끝나는 것은 아니다. 작업이 실패했을 수도 있기 때문에 finised 나 failure를 경우에 맞게 보내준다.

출처 : Developer Apple

 

 

 

 

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 는 원하는 형식으로 값을 받아 사용할 수 있다.

대부분 배열에서 사용해봤던 것이기 때문에 익숙할 것이다.

출처 : Developer Apple

 

 

 

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의 주요 개념과 동작 원리에 대해 정리해보았다.다음은 실제 코드를 통해 어떤 식으로 사용하는지 공부해야겠다.😄

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함