wafflestudio / seminar-2021

2021 Rookies 세미나
47 stars 110 forks source link

RxSwift Observable Stream에서 UI를 조작하는 경우 #607

Closed shp7724 closed 2 years ago

shp7724 commented 2 years ago

안녕하세요.

RxSwift 공부중에 한 가지 궁금한 점이 생겨 질문드립니다. DispatchQueueOperationQueue 등을 사용하여 비동기 작업을 할 때 UI 조작은 반드시 Main Thread에서 이루어져야 한다고 배웠는데요. Observable Stream을 사용하여 비동기로 UI를 조작하는 경우에는 이를 따로 고려하지 않아도 되는지 궁금합니다.

제가 추측하기론 Observablessubscribe를 할 때마다 하나의 비동기 stream이 생성되고, 이 비동기 stream에서 이벤트가 발생할 때마다 Observer에 알림이 가고, 그 때마다 Observer에 등록된 작업(subscribe에 인자로 들어갔던 escaping closure)이 실행되는데, 이것은 Main Thread에서 이루어지므로 자유롭게 UI를 조작해도 된다고 생각했는데, 이게 맞게 이해한 것인지 궁금합니다.

감사합니다.

shp7724 commented 2 years ago

음.. 조금 더 찾아보니 UI 조작을 위해서는 MainScheduler를 사용한다고 하네요. 지금까지는 이런 부분 고려하지 않고 UI 조작해도 문제가 되지 않았었는데 MainScheduler가 언제 필요한건지 알 수 있을까요?

Ethan-MoBeau commented 2 years ago

observeOn() 을 스트림 사이에 끼워서 MainScheduler에서 강제로 동작하게 해주셔도 되고, RxCocoa에 있는 Driver를 이용해서 Observable을 asDriver로 바꿔서 메인 스레드로 돌려버리는 것도 방법입니다. 이런 작업 없으면 구독한 후 실행되는 클로저가 메인 스레드에서 이뤄진다는 보장이 없습니다

말씀하신대로 UI 작업은 유저에게 보이는 컴포넌트를 세팅하는 작업이고, 늦어지면 안 되는 가장 우선순위에 있는 작업이기에 메인 스레드 (메인 스케줄러)에서 돌립니다. 지금까지 별 문제없이 잘 된 이유는 프로젝트가 크지 않아서 백그라운드에서 돌아가는 작업이 없었기에 별도로 세팅 안해도 알아서 UI 잡이 메인에서 돌았기 때문일거에요