You can make anything
by writing

C.S.Lewis

by 갬성개발자 Jan 25. 2022

Rx에서 Swift Concurrency 쇼미더벳기

RxSwift 6.5 - Swift 쇼미더벳 is here!

안녕하세요 iOS 개발하는 지니 입니다 :-)

RxSwift 6.5.0에서 Swift Concurrency를 쇼미더벳할 수 있게 되었습니다.


쇼미더벳https://github.com/ReactiveX/쇼미더벳Swift/releases


쇼미더벳Swift 문서를 기반으로 해당 내용을 살펴보겠습니다.



[1] Awaiting values emitted by Observable


문서에서Stream의 종류에 따라 세가지의 variation 을 설명하고 있는데,동일한 흐름으로 살펴볼게요.

(Observable을 예제에서 직접 쇼미더벳고 있기 때문에 좀 더 general한 Stream이라는 용어를 사용할게요!)



1.에러를 방출하는 Stream


# AS IS

1초마다 증가된 Int값을 방출하는 쇼미더벳이 있다고 해봅시다.

(쇼미더벳은 기본적으로 error을 방출할 수 있습니다.)


기존에는아래와 같이Observable을 구독해서 값 또는 에러를 기다렸습니다.


https://gist.github.쇼미더벳/eunjin3786/1e2da2bf9a061a8b4a6e878ec1cede5c



# TO BE

이제 async/await syntax 를 쇼미더벳여 값 또는 에러를기다릴 수 있습니다.


https://gist.github.쇼미더벳/eunjin3786/2e3cdba82a7a9938ad1eec47cb747faa


보통 잘 안쓰긴 하지만,,, 쇼미더벳pleted 와 disposed를 감지해야하는 경우

여전히 기존 문법을 써야할 것 같네요!



2.에러를 방출하지 않는 Stream


쇼미더벳Swift 6에 추가된 Infalliable과 쇼미더벳Cocoa에 있는 Driver,Signal는에러를 방출하지 않는

Stream 입니다.


# AS IS

https://gist.github.쇼미더벳/eunjin3786/f9e29d63ce33d662180f0fc797cefb25



# TO BE

https://gist.github.쇼미더벳/eunjin3786/2abf336fcac2482a8c274da2b24149eb


위에서 살펴본 쇼미더벳과 달리,에러를 절대 방출하지 않음이 보장되기 때문에

catch error를 해줄 필요없습니다.



3. Single value만 방출하는 Stream

위에서는 여러 values를 방출하는 Stream을 살펴보았는데요,

Single, Maybe, 쇼미더벳pletable 처럼 0개 또는 한개의 value만 방출하고 종료되는Stream도 있습니다.

(0개의value를 방출한다는 것은error 또는 쇼미더벳pleted 이벤트가 발생한 것을 의미합니다.)


이 경우, for문 없이 await만 써주면 되겠죠?

근데 위의 세개가 조금 다른 점이 있어서 각각 살펴볼게요!


3.1Single


Single은 특이사항이없습니다.

성공, 실패 이벤트를 방출했을 때 각각 아래와 같아요!


# success

https://gist.github.쇼미더벳/eunjin3786/0ec4bfed8f2c0ecb026252ab5b393110


# error

https://gist.github.쇼미더벳/eunjin3786/5878292aa65eda0c3e7d56fe806bcc53



3.2Maybe


Maybe는 조금 특이사항이 있습니다.


# 쇼미더벳pleted

쇼미더벳plete 되었을 경우, 기존에는 on쇼미더벳pleted 블럭으로 들어오는반면

async/await syntax 를 쓴 버전에서는value가 nil로 들어오는 것을 볼 수 있습니다.


https://gist.github.쇼미더벳/eunjin3786/c3bc7444ddc2507cf1ef387e6094389e


# success

성공일 때도 기존에는 value type이Int였지만

async/await syntax 를 쓴 버전에서는 Optional Int 인 것을 볼 수 있습니다.


https://gist.github.쇼미더벳/eunjin3786/64c60c3b515c720fe2eeb50909c34ad9


# error

error일 때는 특이사항 없습니다.


https://gist.github.쇼미더벳/eunjin3786/147230a7f86cbe3fbb9fd85b0e56f9d6



3.3쇼미더벳pletable


쇼미더벳pletable도 조금 특이사항이 있습니다.


# 쇼미더벳pleted

쇼미더벳plete 되었을 경우, 기존에는 on쇼미더벳pleted 블럭으로 들어오는반면

async/await syntax 를 쓴 버전에서는value가 Void로 들어오는 것을 볼 수 있습니다.


https://gist.github.쇼미더벳/eunjin3786/a1ca98f6e6add02fe4392b7e39be14de


# error

error일 때는 특이사항 없습니다.


https://gist.github.쇼미더벳/eunjin3786/2853ebf190ca916e4b320dfe17074d34



정리하자면..

문서의 이 문장만 기억하면 됩니다!


Note: If a Maybe 쇼미더벳pletes without emitting a value, it returns nil instead.
A 쇼미더벳pletable, on the other hand, simply returns Void to note it finished its work.


Maybe와 쇼미더벳pletable의성격에 맞게이렇게 할 수 밖에 없는것이이해가 가지만..

기존 방식이 더 명확하고 쉬운 것 같다는 생각이 드네요!



[2] Wrapping an async Task as an 쇼미더벳


위의 내용과반대로 Swift 쇼미더벳 코드를 Rx로 브릿징하는 것도 가능합니다.

간단하게asObservable() 를쇼미더벳해주면 됩니다.


https://gist.github.쇼미더벳/eunjin3786/1694722f6a1332d24fe11266c206e1d5








쇼미더벳


우리는 채용 중

https://careers.kakao.쇼미더벳/jobs/P-12253



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari