티스토리 뷰

Combine

Combine (1-1) - Subcribers.Demand

Zedd0202 2020. 2. 26. 10:24
반응형

 

안녕하세요 :) Zedd입니다.

 

https://zeddios.tistory.com/925

 

Combine (1) - Publisher, Subscriber

안녕하세요 :) Zedd입니다. 이번 휴가동안 SwiftUI를 좀 해볼라하는데 Combine모르면 이거 걍 노답임.... -> 휴가 끝나버렸죠? 2020년 되버렸죠??????;; 그래서 Combine공부.. Combine Combine이 너무 핫했어서....

zeddios.tistory.com

여기서 제 궁금증은 

 

이거..!!!

나는 1번에서 max(1)로 주고 2번에서 max(2)로 줬는데

 

응 구독 시작이야~

Zedd

Terror Jr

Alan Walker

Martin Garrix

Don Diablo

응 완료야 finished

 

ㄱㅏ 나오는지...

저 글에 추가하려다가 글이 길어질 것 같아 따로 쓰기로 했어요 ㅎㅎ

 

learncombine/HackingCombine

Exploring uncharted territory in Combine. 🤠. Contribute to learncombine/HackingCombine development by creating an account on GitHub.

github.com

여기에 다 나와있습니다...! 제 글 말고 이거 보셔도 되어요..!!!!!!!

아무튼 정답은...누적이었따!!!!!!

 

 자 코드를 이렇게 수정해볼게요. 바뀐 부분은 

 

이 부분.

위 receive(_:)메소드에서 subscriber의 demand를 동적으로 조절이 가능한데요,

새로운 demand는

내가 1번에서 request로 줬던 demand + receive(_:)에서 리턴한 demand입니다.

 

네 합이요!!!!!

 

그러니까 제가 1번에서 1을 리턴했잖아요?

근데 receive(_:)에서 

(처음 값을 판단 할 수가 없어서 임의로 저렇게 넣어줬어요. 위 링크도 마찬가지.

원리만..이해하고 넘어갑시다...!!) 

 

첫번째 값 = Zedd가 들어오면 max(2)를 리턴해요~

그러면?

 

1번에서의 demand = 1

2번에서의 demand = 2

1 + 2 = 3

 

이 됩니다.

자, 다음은 "Terror Jr"이 들어올건데요, "Zedd"가 아니니..default로 들어갈테고 none으로 리턴될테니..

demand는 바뀌지 않게 됩니다.

 

그래서 결과는?

 

 

응 구독 시작이야~

Zedd

Terror Jr

Alan Walker

 

가 됩니다!!!!!!!

 

제가 1번에서 max(1)을 주고

2번에서 max(2)를 리턴했는데 

 

응 구독 시작이야~

Zedd

Terror Jr

Alan Walker

Martin Garrix

Don Diablo

응 완료야 finished

 

전부 다 나온 이유..!! 아시겠죠?

 

1 + 2 + 2 + 2...이렇게 Demand가 계속 누적되어서 전부 다 나올 수 있었던거에요!

 

악 그리고..

 

이렇게 아주 좋은 메소드가 있었네요...

 

출력은

 

receive subscription: (["Zedd", "Terror Jr", "Alan Walker", "Martin Garrix", "Don Diablo"])

응 구독 시작이야~

request max: (1)

receive value: (Zedd)

request max: (2) (synchronous)

receive value: (Terror Jr)

receive value: (Alan Walker)

 

아 간지 안나게....print 일일이 했네..ㅎ

여러분들은 print()를 애용하시길..

 

 

자 그리고 예제를 하나 더 볼게요.

 

ZeddSubscriber안에 subscription변수를 하나 만들었습니다. 

 

PassthroughSubject는....다음 글에서 공부하긴 할건데, 

Combine의 Suject프로토콜의 concrete implementation중 하나에요. 

send를 통해 값을 주입할 수 있습니다. 

 

 자 이렇게 하면 아까랑 결과는 똑같아요~

하지만

 

이렇게 아까 만들어놨던 subscription변수를 통해 demand를 새로 request하면 어떻게 될까요~?

 

demand가 누적되는건 아니고 

demand의 값이 2로 바뀌게 됩니다.

그래서 

출력은 

 

 

receive subscription: (PassthroughSubject)

request max: (1)

receive value: (Zedd)

request max: (2) (synchronous)

receive value: (Terror Jr)

receive value: (Alan Walker)

request max: (2)

receive value: (Avicii)

receive value: (LANY)

 

 

이렇게 됩니다. 

 

send를 통해 값을 주입 할 수도 있지만, completion도 주입 할 수 있어요. 

 

결과는 

 

 

receive subscription: (PassthroughSubject)

request max: (1)

receive value: (Zedd)

request max: (2) (synchronous)

receive value: (Terror Jr)

receive value: (Alan Walker)

receive finished

request max: (2)

 

여기서 알 수 있는 사실은

뭐 당연하겠지만

publisher가 완료되면, 더이상 값 또는 완료 이벤트를 수신하지 않습니다. 

 

 

 

반응형

'Combine' 카테고리의 다른 글

Combine + UIKit  (2) 2020.04.19
Combine (4) - Cancellable  (0) 2020.03.24
Combine (3) - Scheduler  (4) 2020.03.23
Combine (2) - Subject  (0) 2020.02.29
Combine (1) - Publisher, Subscriber  (3) 2020.02.25