RxSwift 6.5 - Swift Concurrency is here!
안녕하세요 iOS 개발하는 지니 입니다 :-)
RxSwift 6.5.0에서 Swift Concurrency를 사용할 수 있게 되었습니다.
RxSwift 문서 를 기반으로 해당 내용을 살펴보겠습니다.
문서에서 Stream의 종류에 따라 세가지의 variation 을 설명하고 있는데, 동일한 흐름으로 살펴볼게요.
(Observable을 예제에서 직접 사용하고 있기 때문에 좀 더 general한 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 를 감지해야하는 경우
여전히 기존 문법을 써야할 것 같네요!
RxSwift 6에 추가된 Infalliable과 RxCocoa에 있는 Driver, Signal는 에러를 방출하지 않는
Stream 입니다.
# AS IS
https://gist.github.com/eunjin3786/f9e29d63ce33d662180f0fc797cefb25
# TO BE
https://gist.github.com/eunjin3786/2abf336fcac2482a8c274da2b24149eb
위에서 살펴본 Observable과 달리, 에러를 절대 방출하지 않음이 보장되기 때문에
catch error를 해줄 필요없습니다.
위에서는 여러 values를 방출하는 Stream을 살펴보았는데요,
Single, Maybe, Completable 처럼 0개 또는 한개의 value만 방출하고 종료되는 Stream도 있습니다.
(0개의 value를 방출한다는 것은 error 또는 completed 이벤트가 발생한 것을 의미합니다.)
이 경우, for문 없이 await만 써주면 되겠죠?
근데 위의 세개가 조금 다른 점이 있어서 각각 살펴볼게요!
Single은 특이사항이 없습니다.
성공, 실패 이벤트를 방출했을 때 각각 아래와 같아요!
# success
https://gist.github.com/eunjin3786/0ec4bfed8f2c0ecb026252ab5b393110
# error
https://gist.github.com/eunjin3786/5878292aa65eda0c3e7d56fe806bcc53
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
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의 성격에 맞게 이렇게 할 수 밖에 없는 것이 이해가 가지만..
기존 방식이 더 명확하고 쉬운 것 같다는 생각이 드네요!
위의 내용과 반대로 Swift Concurrency 코드를 Rx로 브릿징하는 것도 가능합니다.
간단하게 asObservable() 를 사용해주면 됩니다.
https://gist.github.com/eunjin3786/1694722f6a1332d24fe11266c206e1d5
https://careers.kakao.com/jobs/P-12253