brunch

You can make anything
by writing

C.S.Lewis

by 갬성개발자 Jan 25. 2022

Rx에서 Swift Concurrency 사용하기

RxSwift 6.5 - Swift Concurrency is here!

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

RxSwift 6.5.0에서 Swift Concurrency를 사용할 수 있게 되었습니다.


https://github.com/ReactiveX/RxSwift/releases


RxSwift 문서 를 기반으로 해당 내용을 살펴보겠습니다. 



[1] Awaiting values emitted by Observable


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

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



1. 에러를 방출하는 Stream


# AS IS 

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

(Observable은 기본적으로 error을 방출할 수 있습니다.)


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


https://gist.github.com/eunjin3786/1e2da2bf9a061a8b4a6e878ec1cede5c



# TO BE

이제 async/await syntax 를 사용하여 값 또는 에러를 기다릴 수 있습니다. 


https://gist.github.com/eunjin3786/2e3cdba82a7a9938ad1eec47cb747faa


보통 잘 안쓰긴 하지만,,, completed 와 disposed 를 감지해야하는 경우

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



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


RxSwift 6에 추가된 Infalliable과 RxCocoa에 있는 DriverSignal는 에러를 방출하지 않는 

Stream 입니다. 


# AS IS

https://gist.github.com/eunjin3786/f9e29d63ce33d662180f0fc797cefb25



# TO BE

https://gist.github.com/eunjin3786/2abf336fcac2482a8c274da2b24149eb


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

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



3. Single value만 방출하는 Stream

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

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

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


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

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


3.1 Single


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

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


# success  

https://gist.github.com/eunjin3786/0ec4bfed8f2c0ecb026252ab5b393110


# error

https://gist.github.com/eunjin3786/5878292aa65eda0c3e7d56fe806bcc53



3.2 Maybe


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


# completed

complete 되었을 경우, 기존에는 onCompleted 블럭으로 들어오는 반면

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


https://gist.github.com/eunjin3786/c3bc7444ddc2507cf1ef387e6094389e


# success

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

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


https://gist.github.com/eunjin3786/64c60c3b515c720fe2eeb50909c34ad9


# error

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


https://gist.github.com/eunjin3786/147230a7f86cbe3fbb9fd85b0e56f9d6



3.3 Completable


Completable도 조금 특이사항이 있습니다. 


# completed

complete 되었을 경우, 기존에는 onCompleted 블럭으로 들어오는 반면

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


https://gist.github.com/eunjin3786/a1ca98f6e6add02fe4392b7e39be14de


# error

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


https://gist.github.com/eunjin3786/2853ebf190ca916e4b320dfe17074d34



정리하자면..

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


Note: If a Maybe completes without emitting a value, it returns nil instead. 
A Completable, on the other hand, simply returns Void to note it finished its work.


Maybe와 Completable의 성격에 맞게 이렇게 할 수 밖에 없는 것이 이해가 가지만..

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



[2] Wrapping an async Task as an Observable


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

간단하게 asObservable() 를 사용해주면 됩니다. 


https://gist.github.com/eunjin3786/1694722f6a1332d24fe11266c206e1d5









우리는 채용 중 

https://careers.kakao.com/jobs/P-12253



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