서론
안녕하세요 불망입니다!
이번에 ADA 마지막 프로젝트 개발 작업을 하면서 제가 뷰가 멈추는 현상에 직면했습니다.
그 문제를 해결하는 내용을 작성해봤습니다! 보시고 틀린 점이나 피드백 주실 부분 댓글로 남겨주시면 감사하겠습니다~!
문제 현상
ImageLoadingView 에서 유저가 선택한 PDF 파일을 Image로 변경할 때 뷰가 얼어버리는 현상이 생겼습니다.
눈으로 확인하시면 더 쉬우실 것 같아서 gif 파일을 보면 좋을 것 같아요
저희 코드에는 convertPDFToImages함수가 있는데 Pdf를 Image로 변경시켜주는 함수 입니다.
이 함수가 실행이 시작 되는 코드는 LoadingView가 나타나면(.onAppear) 실행이 됩니다.
LoadingView가 나타나는 조건은 파일이 선택되었을때 LoadingView로 이동하게 됩니다.
첫 번째 방법(동기)
아래 보이는 GIF는 따로 비동기 코드를 작성하지 않는 경우에서 사용되는 예시입니다.
파일이 선택되었을때 이미 프로그램내에서는 LoadingView로 이동이 되었고 이미지 변환이 시작되었습니다. 그 이유로 출력창을 보면 이미지 변환율이 나타나고 있습니다. 하지만 View는 얼어버렸고 LoadingView로 전환이 되지도 않고 ProgressBar도 제대로 동작하지 않고 있습니다.
두 번째 방법(비동기-DispatchQueue.main.async)
이번에는 비동기를 사용해봤습니다.
DispatchQueue.main.async를 이용하여 코드 실행을 비동기로 바꿔주었습니다.
하지만 제가 원하는 결과가 나오지 않았습니다. LoadingView로 이동은 하였지만 마찬가지로 ProgressBar가 제대로 동작되지 않았습니다. 출력창에서 이미지 변환율이 올라가지만 ProgressBar가 업데이트 되지 않는 상태가 보입니다.
ProgressBar가 제대로 동작하지 않는 이유는 DispatchQueue.main.async을 사용해서 입니다.
DispatchQueue.main.async 는 Main Thread를 사용하는데 Swift에서 Main Thread는 View의 상태를 관리해주는 역할을 합니다. 그 상황에서 convertPDFToImages 함수를 Main Thread에 넣으니 View가 얼어버리는 현상이 나온 것 입니다.
세 번째 방법(비동기-DispatchQueue.global().async)
그래서 세 번째 방법으로 비동기를 사용하지만 DispatchQueue.global().async를 사용하여 나머지 스레드를 사용하게 했습니다.
DispatchQueue.global().async는 주로 CPU 집약적인 작업이나 네트워크 호출과 같은 시간이 오래 걸리는 작업을 메인 스레드에서 분리하여 앱의 반응성을 유지하기 위해 사용됩니다.
아래 GIF를 보시면 제가 원하는 방향으로 작동을 하게 되었습니다!
결론
- View를 업데이트 해준다거나 변환 함수를 사용한다거나 api 호출 등등 여러가지 작업에서 개발자는 View가 멈추는 것에 대해서 항상 조심해야 합니다..!
- 비동기/동기에 대해서 확실하게 이해하고 사용하면 개발할때 훨씬 쉽게 개발할 수 있는 것 같습니다.
'Swift > 개발' 카테고리의 다른 글
[Swift] 이미지 저장 기능 (0) | 2023.10.31 |
---|---|
[Swift] 폴더 이름 중복 검사 (1) | 2023.10.28 |
[SwiftUI] 프로그램 차단 기능 (0) | 2023.10.06 |
[SwiftUI] 애플스토어 앱 클론코딩(스크롤) (0) | 2023.07.08 |
[SwiftUI] 알람 앱 클론코딩 (0) | 2023.07.07 |