인프런 커뮤니티 질문&답변

w0308h님의 프로필 이미지
w0308h

작성한 질문수

앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해

2) 간단한 GCD/Operation소개

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

작성

·

389

1

안녕하세요.

강의 잘 듣고 있습니다!

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

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

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

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

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

답변 2

1

w0308h님의 프로필 이미지
w0308h
질문자

답변 감사합니다!

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

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

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

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

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

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

1

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 안녕하세요! w0308h 님.

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

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

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

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

let data = try? Data(contentsOf: url)

 

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

 

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

 

감사합니다. :)

w0308h님의 프로필 이미지
w0308h

작성한 질문수

질문하기