티스토리 뷰

반응형

 

iOS개발을 하면서, Combine framework를 활용할 수 있습니다. Publisher로부터 이벤트를 받고자 구독을 할 때, 실행할 동작을 메인스레드에서 동작하고 싶을때가 있습니다. 대표적으로 UI를 업데이트해야할 때인데요. 그럴때 publisher 구독 과정에서 receive(on:)을 사용해서 메인스레드를 지정할 수 있습니다.

일반적으로 DispatchQueue.main을 생각하실 수 있는데 RunLoop.main도 메인스레드 지정에 사용이 가능합니다.

이전까지는 DispatchQueue를 위주로 사용했다가 Combine 관련 유데미 강의에서 RunLoop.main을 사용하는 것을 보고 사용을 해본 경험이 있었는데요. 과연 이 둘은 완전 똑같은 동작을 수행할까요? 그것은 아니라고 합니다. 

오늘은 Combine Publisher 구독 등에 스레드 지정이 필요할때 사용되는 RunLoop.main, DispatchQueue.main의 차이를 알아보겠습니다.

 


Combine Publisher를 구독할때 메인스레드 지정하기

let subject = PassthroughSubject<Int, Never>()
var cancellables = Set<AnyCancellable>()

subject
    .receive(on: DispatchQueue.main)
    .sink { _ in
        debugPrint("do something")
    }
    .store(in: &cancellables)

subject
    .receive(on: RunLoop.main)
    .sink { _ in
        debugPrint("do something")
    }
    .store(in: &cancellables)

우리가 보통 Combine Publisher의 이벤트를 구독할때 위와 같이 구독을 해서 이벤트에 따른 동작을 구현할 수 있는데요. 이때 receive(on:)을 사용하여 스레드 지정이 가능합니다.

위 코드를 보시면, 위에선 DispatchQueue.main을, 아래에선 RunLoop.main을 사용하고 있습니다.

 


RunLoop와 DispatchQueue

RunLoop는 윈도우 체계에서 발생하는 마우스, 키보드 등의 이벤트, 터치 이벤트 등의 소스 입력을 처리하는 객체입니다. 시스템에 의해 만들어지고 관리되며, 메인스레드를 표현하는 RunLoop.main 를 사용할 수 있습니다. 

 

 

DispatchQueue.main은 현재 프로세스의 메인스레드와 연관이 있습니다. DispatchQueue는 메인스레드, 백그라운드 스레드 등에서 serial, concurrent한 동작을 수행하고 싶을때 사용할 수 있어요.

 

 


DispatchQueue.main, RunLoop.main의 동작 간 공통점

이 둘의 공통점은 모두 특정 동작이 메인스레드에서 동작하도록 하고 싶을때 사용할 수 있다는 것입니다. publisher와 사용될때에는 receive(on:)의 parameter로 DispatchQueue.main, RunLoop.main을 사용하면 downStream이 메인스레드에서 동작하도록 할 수 있습니다.

 


DispatchQueue.main, RunLoop.main의 차이

DispatchQueue.main과 RunLoop.main은 비슷해보이지만 차이점도 존재합니다. RunLoop는 작업이 busy한 경우, UI의 업데이트를 즉시 처리하지 않을 수 있습니다.

예를들면, 스크롤링 같은 사용자 이벤트가 발생했고, 스크롤링 과정에서 UI 업데이트가 필요할때, DispatchQueue.main은 스크롤링동작과 함께 UI업데이트 처리를 하지만, RunLoop.main은 스크롤링 이벤트가 끝나고 나서야 UI가 업데이트 됩니다.

즉, 중요한 차이점은 RunLoop는 User Interaction이 발생하는 경우, 해당 Interaction 이벤트가 끝나고 나서 UI업데이트 동작을 할 수 있습니다. 따라서, 사용자 상호작용과 함께 UI 업데이트가 필요한 경우, 기본적으로 DispatchQueue.main을 사용하는 것이 좋다고 생각됩니다.

반대로, 사용자 상호작용과 함께 UI 업데이트가 당장 필요가 없다고 판단된다면, 옵션으로 RunLoop.main을 사용할 수도 있겠습니다.

 


지금까지 iOS개발을 할때 Combine Publisher의 downStream 스레드 지정 간 receive(on:) parameter로 사용될 수 있는 RunLoop.main, Dispatchqueue.main의 동작 간 공통점 및 차이점을 알아봤습니다. 많은 의견 부탁드립니다. 감사합니다.

 

iOS DispatchQueue.main, RunLoop.main 차이 참고 블로그 ▼

 

[번역] RunLoop.main과 DispatchQueue.main의 차이

Combine을 공부하다가 주로 receive(on: ) 을 통해 메인 스레드 혹은 Runloop.main으로 스레드를 변경할 때가 있습니다.어떤 차이점이 있는지 궁금해서 알아보았습니다.번역을 통해 진행하였습니다.https:/

velog.io

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함