• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

global큐에 sync로 작업을 보냈을 때는 터지지 않는 이유가 궁금합니다.

23.03.15 11:17 작성 조회수 305

1

안녕하세요.

강의 잘 듣고 있습니다!

sync를 공부하다가 의문이 생겨서 질문 남깁니다.

메인스레드에서 메인큐로 sync로 작업을 보내면

ui를 보여줘야할 메인에서 작업을 한없이 기다리게 되니 크래시가 난다고 알고 있습니다.

강의에서, 메인에서 글로벌큐로 sync로 작업을 보내더라도 실질적으로는 메인에서 작업을 한다고 하셨는데요.

그렇다면 실질적으로는 메인에서 sync로 작업을 하는 것과 다를 바가 없는데, 그런 경우에는 왜 크래시가 발생하지 않는 건가요?

답변 2

·

답변을 작성해보세요.

1

w0308h님의 프로필

w0308h

질문자

2023.03.15

답변 감사합니다!

강의를 복기해보는 과정에서

메인 -> 메인으로 sync task를 보내는 데드락 상황과

메인 -> 글로벌로 sync task를 보내는 게 헷갈렸던 것 같아요 🥲

이해했습니다! 감사합니다

아 네네 이해되셨다니 다행이네요! 좋은 하루 되세요 :)

1

네 안녕하세요! w0308h 님.

왜 클로저 안의 작업을 다른 쓰레드로 동기로 보내면 한없이 기다리게 된다고 생각하셨을까요?

작업을 다른 쓰레드로 보내도 한없이 기다리지 않습니다. 예를 들어서, 3초가 걸리는 작업을 다른 쓰레드로 동기(sync)로 보냈으면, 그 작업이 종료 될때까지 "3초간만" 기다리기 때문에 크래시가 발생하지 않습니다.

네 그리고 말씀하신 대로 sync로 일을 보내면 (실제로도 다른 쓰레드에 일을 보낼 필요가 없고 메인쓰레드에서 작업 하기 때문에) 메인쓰레드에서 3초간의 오래걸리는 일을 할뿐. 즉, 그래서 화면이 버벅이게 될 뿐 크래시가 발생하지 않습니다.

예를 들어 내부가 비동기로 구현되지 않은 아래 와 같은 작업을 DispatchQueue.global().sync 로 보내시면 메인쓰레드에서 직접 일을 하고, 오래 동안 걸리기 때문에.. 어떤 화면 애니메이션이라던지 / 스크롤이라던지가 버벅일 뿐 크래시가 나는 것은 아닙니다.

let data = try? Data(contentsOf: url)

 

물론, 아직 강의 뒤쪽을 안보신 것 같은데, 실제 크래시가 나는 DeadLock 같은 상황들은 따로 있습니다.

 

일단 말씀주신 질문 내용은 답변을 드린 것 같고, 연관해서 크래시가 나는 실제 상황들은 강의 뒤쪽에서 또 말씀드리니.. 그 부분들을 보신 후에 추가적으로 궁금하신 내용들이 생기시면 질문주세요!

 

감사합니다. :)