최근 프로젝트를 진행하며, 어렵게 느껴진 부분이 있다
쓰레드를 다루고 비동기처리를 순서대로 정렬하고 Thread-safe 하게끔 코드가 동작하게 하는 것이다.
Swift에서는 UI 화면을 업데이트를 하려면 메인 쓰레드에서만 가능하다.
그런데 메인 쓰레드에서 UI업데이트도 하고, 영상 추출 및 병합도 또한 진행하려고 하니
진행도를 표시하는 UI가 변하지 않는 부분에서 애를 먹었다.
애플에서는 AVFoundation에서 영상을 다루는 데, 영상을 추출하는 부분은 비동기 함수로 제공한다.
그동안 동기적, 순서대로 작동하게끔 코드를 구성하는 게 익숙해진 나에게 비동기적으로
로직이 작동하는 부분에서 굉장히 헷갈렸다.
지금도 또한 코드가 비동기적으로 진행할 때에 어떻게하면 Thread-safe하게 구성하게 할 지가 쉽지않다.
iOS15버전에서는 메인쓰레드를 semaphore 또는 DispatchGroup으로 동작을 멈추게 한 후에
비동기 함수가 끝나고 semaphore.signal, dispatchgroup.wait 함수를 통해 동기적으로 진행하려고 했다.
UI 화면에 대한 입력은 RunLoop로 진행하고 말이다.
iOS16버전으로 업데이트하면서 이렇게 진행했을 때, 쓰레드 순위 역전 오류가 뜨며 앱 크러시가 나지는 않지만
내가 원하는 동작이 안 되고 다른 오류도 발생하게 되었다.
결국 메인쓰레드를 멈추게 한 후 다른 쓰레드에서 일 처리가 다 끝나길 기다리는게 아닌
우선 메인쓰레드 작업하는 부분을 가볍게 구성하고, 먼저 메인 쓰레드 작업을 끝내놓고
다른 쓰레드에서 로직이 끝나거나 필요로 할 때 메인 쓰레드를 작동하게 하게끔 코드를 수정했다.
메인쓰레드 작업도 가벼워져 사용자 편의성을 높일 수 있게 되었다.
이 일을 꽤 오랜 시간을 잡아먹었는데, 메인 쓰레드를 가볍게 하도록 수정을 하는 것에 대하여 두려움을 가졌기 때문이다.
몇 달간의 작업을 통해 제대로 작동하게끔 몇 백 혹은 몇 천줄의 코드를 작성하게 되었는데,
이것을 다시 새로이 만드는 게 심적 부담감으로 다가왔기 때문이다.
다른 사람의 조언을 받아 자신감을 가지고 코드를 전체적으로 수정하고 기능이 제대로 동작할 때
기쁘면서도 내 자신이 답답했다.
다른 책에서 조언을 주듯이, 코드(장난감)을 수정하는데 거리낌이 없어야 된다고 보았는데
내가 그걸 머리로는 알지만 선뜻 행동으로 나서기가 쉽지 않았기 때문이다.
그래도 이번 일을 계기로 좀 더 성장한 것 같다!
'iOS > 강의, 고찰' 카테고리의 다른 글
[Objective-C, iOS] Objective-C 헤더와 m 파일에 대한 이해 (0) | 2023.03.20 |
---|---|
[번역] 미디어 데이터 비동기 호출 (0) | 2022.12.06 |
[iOS, Swift] 동시성 프로그래밍 작성 시 생길 수 있는 문제 (0) | 2022.11.01 |
[iOS, Swift] GCD 사용 시 주의점 (0) | 2022.11.01 |
[iOS, Swift] DispatchQueue 서비스품질 (QoS) (0) | 2022.11.01 |