iOS/강의, 고찰

[iOS, Swift] 메인 쓰레드 글로벌 쓰레드 생각

검은참깨두유vm 2022. 11. 16. 17:17
반응형

최근 프로젝트를 진행하며, 어렵게 느껴진 부분이 있다

쓰레드를 다루고 비동기처리를 순서대로 정렬하고 Thread-safe 하게끔 코드가 동작하게 하는 것이다.

Swift에서는 UI 화면을 업데이트를 하려면 메인 쓰레드에서만 가능하다.

그런데 메인 쓰레드에서 UI업데이트도 하고, 영상 추출 및 병합도 또한 진행하려고 하니

진행도를 표시하는 UI가 변하지 않는 부분에서 애를 먹었다.

애플에서는 AVFoundation에서 영상을 다루는 데, 영상을 추출하는 부분은 비동기 함수로 제공한다.

그동안 동기적, 순서대로 작동하게끔 코드를 구성하는 게 익숙해진 나에게 비동기적으로 

로직이 작동하는 부분에서 굉장히 헷갈렸다.

지금도 또한 코드가 비동기적으로 진행할 때에 어떻게하면 Thread-safe하게 구성하게 할 지가 쉽지않다.

iOS15버전에서는 메인쓰레드를 semaphore 또는 DispatchGroup으로 동작을 멈추게 한 후에 

비동기 함수가 끝나고 semaphore.signal, dispatchgroup.wait 함수를 통해 동기적으로 진행하려고 했다.

UI 화면에 대한 입력은 RunLoop로 진행하고 말이다.

iOS16버전으로 업데이트하면서 이렇게 진행했을 때, 쓰레드 순위 역전 오류가 뜨며 앱 크러시가 나지는 않지만

내가 원하는 동작이 안 되고 다른 오류도 발생하게 되었다.

결국 메인쓰레드를 멈추게 한 후 다른 쓰레드에서 일 처리가 다 끝나길 기다리는게 아닌 

우선 메인쓰레드 작업하는 부분을 가볍게 구성하고, 먼저 메인 쓰레드 작업을 끝내놓고

다른 쓰레드에서 로직이 끝나거나 필요로 할 때 메인 쓰레드를 작동하게 하게끔 코드를 수정했다.

메인쓰레드 작업도 가벼워져 사용자 편의성을 높일 수 있게 되었다.

 

이 일을 꽤 오랜 시간을 잡아먹었는데, 메인 쓰레드를 가볍게 하도록 수정을 하는 것에 대하여 두려움을 가졌기 때문이다.

몇 달간의 작업을 통해 제대로 작동하게끔 몇 백 혹은 몇 천줄의 코드를 작성하게 되었는데,

이것을 다시 새로이 만드는 게 심적 부담감으로 다가왔기 때문이다.

다른 사람의 조언을 받아 자신감을 가지고 코드를 전체적으로 수정하고 기능이 제대로 동작할 때

기쁘면서도 내 자신이 답답했다.

다른 책에서 조언을 주듯이, 코드(장난감)을 수정하는데 거리낌이 없어야 된다고 보았는데

내가 그걸 머리로는 알지만 선뜻 행동으로 나서기가 쉽지 않았기 때문이다.

그래도 이번 일을 계기로 좀 더 성장한 것 같다!

 

 

 

반응형