• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

main.async 작동 질문(+ vs global(),async)

23.08.14 22:09 작성 조회수 255

0

안녕하세요!

main.async 작동 관련하여 궁금한점이 있어 질문드립니다.

대게, 네트워킹 작업과 같은 부분은 global().async로 메인쓰레드가 아닌 다른 쓰레드로 작업을 보내서 백그라운드에서 돌게 하는데,

어떻게 보면 작동하는 앱(프로세스)별로 메인 쓰레드는 하나일텐데, main.async는 어떻게 작동하는지 잘 모르겠어요.

제가 이해하고 있는 부분이 맞는지도 헷갈리네요ㅠ

1) 메인 쓰레드에서 서브 쓰레드로 이미지 다운로드 태스킹 보냄

2) 이미지 다운로드가 끝나고 컴플리션 핸들러 실행

3) main.async로 다운로드 받은 이미지로 뷰 업데이트

1)~3) 과정이 대략 비동기를 활용하는 과정인데,

3)에서 main.async로 메인 쓰레드로 작업을 보냈을 때

머릿속에서 도식화가 잘 안되는 것 같습니다.

어느 부분 강의를 보면 좋을지 답변 부탁드립니다. 감사합니다!

 

답변 1

답변을 작성해보세요.

0

네 안녕하세요 asdfaa22 님.

일단, 해당 관련부분은 PDF 교재 102 ~ 104 부분에 있고, 말씀하신 부분이 정확하게는.. 제가 104페이지에서 아래 처럼 도식화 해서 보여드리고 있습니다.
image
사실 가장 추천 드리는 것은 강의를 순서대로 보시면..

섹션 3. GCD - 3.디스패치큐(GCD) 사용시 주의해야할 사항 의 첫번째 강의 파트인
1) 반드시 메인큐에서 처리해야하는 작업 2) sync메서드에 대한 주의사항 3) weak, strong캡처 주의 4)컴플리션핸들러의 존재이유 5) 동기적함수를 비동기함수 처럼 만드는 방법

부분에서 설명드리고 있습니다.

그리고 지금 말씀하신 내용을 보면 정확하게 이해하고 계신데, 어떤 부분이 헷갈리시는지 명확하게는 잘 모르겠습니다.

작동하는 앱. 즉, 프로세스 별로 주로 동작하는 쓰레드는 하나 (그걸 메인 쓰레드라고 부르는 것이 맞고요. 보통 1번 쓰레드라고 표현하기도 합니다.)가 맞습니다.
(아주 정확한 표현은 아니지만, 이해하기 쉽게 표현하기 위해서 쉬운 말로 얘기해보면.. 운영체제는 1개의 CPU를 특정지어서 1개의 앱의 전체를 관리하도록 만들고, 그걸 메인 쓰레드라고 부르는 것이죠. 근데 그 메인쓰레드는 화면을 1초에 60번씩 다시 그리는 아주 중요한 임무도 담당하고 있고요.)

그래서.. 네트워킹과 같은 작업은 오래걸리기 때문에.. 메인 쓰레드가 아닌 global().async등을 이용해서 백그라운드 쓰레드(즉, 2, 3, 4번 등의 메인 쓰레드가 아닌 쓰레드)로 보냅니다.
(해당 의미는 다른 쓰레드로 보내되, 비동기적으로 보내서 해당 작업이 끝나는 것을 기다리지 않는다는 의미입니다.)

그 후에 예를 들어 이미지 같은 것이 다운로드가 다 끝나면.. 다시 1번 쓰레드에게 보내서, 이미지를 표시하는 일을 담당하도록 시킵니다. main.async 로요.
(2, 3, 4번 쓰레드에서 data형태의 파일로 받은 것을, 변환하고.. 그리고 난후에 직접적인 이미지뷰에 이미지를 할당하는 작업만 다시 1번 쓰레드로 비동기적으로 보냅니다. 즉, 실제 다운로드는 백그라운드 쓰레드에서 일어나지만 2, 3, 4번 쓰레드가 1번 쓰레드로 이미지를 표시하는 작업을 보낼때는 굳이 기다릴 필요가 없기 때문에 async로 보냅니다.)


그래서 순서대로 질문주신 내용은 다 맞습니다.
앱(프로세스)별로 메인 쓰레드는 하나이지만, 실제 그 내부에서 동작하는 쓰레드는 여러개가 있고요.

1) 메인 쓰레드에서 서브 쓰레드(2, 3, 4번 쓰레드)로 네트워킹 작업을 보내고

2) 각각의 서브쓰레드에서 다운로드가 일어나고.. (이미지 다운로드가 끝나면) 컴플리션 핸들러 (함수가) 실행하면서

3) 그 이미지를 다시 (main.async를 통해서) 메인 쓰레드로 보냅니다. (이미지를 표시하는 일은 1번 쓰레드 니가 할일이야! 하고 알려주는 것이죠.) 그러면서 1번 쓰레드에서는 다운로드 받은 이미지로 뷰를 업데이트 함


위와 같은 과정이 일어나는 것이 맞습니다.

그래서.. 말씀드린 파트 부분의 강의를 보시고 추가적으로 이해가 안되시는 부분이 있으시면 질문 다시 주시면 답변 드리도록 하겠습니다. :)

감사합니다.

asdfaa22님의 프로필

asdfaa22

질문자

2023.08.18

답변 감사드립니다! 별로 생각하지 않아도 되는 부분인데 이해를 계속 하려다보니 머릿속에서 과부하가 걸린 모양입니다^^;;

헷갈렸던 부분은, 3)에서 메인쓰레드로 비동기로 보냈을 때 “만약, 메인쓰레드에서 다른 태스크를 처리중이면, 3)에서 보낸 태스크와 충돌이 일어나는게 아닌가?” 였는데, 생각해보니 큐에서 메인쓰레드로 태스크를 “배치” 하는거지 “바로 시작해” 라는 뜻이 아닐텐데….? 를 깨닫게 되었습니다.

좋은 강의를 제공해 주셔서 공부하는데 많은 도움이 되고 있습니다.

더위 막바지에 건강 잘챙기세요~!

오! 정확하게 이해하셨네요! 바로 시작해는 아니고,
다음 일처리를 할 수 있을때, 진행해라 라는 의미로 보시면 됩니다.. ^^