• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

11분 25초에서 질문있습니다

21.12.12 22:55 작성 조회수 114

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요 선생님 강의 잘 듣고있습니다.
 
1)
11분 25초 "현재 메인에서 일하고 있다면" 부분이 헷갈려 질문드립니다.
저 말은 디스패치큐 메인 함수 "내부 블록"에Dispatchqueue.global.async{}가 들어갔을떄를 말하고 있는거
맞나요?
현재 메인에서 일하고 있다면 이라는 말이 헷갈려 질문드립니다ㅎㅎ
감사합니다:)

답변 1

답변을 작성해보세요.

0

안녕하세요! 지윤 님!

(1번 질문에 대한 답변) ======================================


해당 내용은, 일반적으로 우리가 다른 쓰레드로 보내는 일을 하지 않으면.. 
당연히 메인쓰레드에서 일을 하게 될텐데요..
(특별하게 다른 쓰레드에서 일을 하고 있지 않은 상황에 대한 가정을 하겠다는)
그런 내용을 말씀드리고 있는 것이예요,

(1) 상황 - 메인쓰레드에서 일을 하고 있다면,

DispatchQueue.global( ).sync {


}


(2) 상황 - 메인쓰레드가 아닌 경우 예를 들어,

DispatchQueue.global(qos: .utility).async { 
         // 이런 상황이라면 이미 2번 쓰레드에서 작업 중일 것          
         DispatchQueue.global( ).sync {        //이런 상황은 괜찮음  (3번 쓰레드로 보낸 작업을 기다림)

         

         }
}


위에 보시면, 2번 상황에서는 이미 2번쓰레드에서 일을 하고 있을테니,
DispatchQueue.global( ).sync { } 이 코드의 역할은 사실은 3번이나, 4번쓰레드 등으로 보낸 작업을
기다린다는 의미가 되어서.. 메인쓰레드를 블락(block)시키지는 않게 됩니다.

그래서, 제가 말씀드리고자 했던 의도는.. (2)번과 같은 상황이 아닌.. 명확하게 (1)번과 같은 상황을
가정한다고 말씀드리는 것입니다... ^^

다른 예를 한번 생각해보면.. 
예를 들어서, URLSession으로 작업 중이라면..
(강의 뒤에서 나오지만, URLSession은 원래부터 다른 쓰레드로 보내
비동기적으로 동작하도록 설계가 되어 있으니..)


URLSession.shared.dataTask(with: url) { ....... in
         // 이런 상황 또한 이미 2번이후의 쓰레드에서 작업 중일 것             

         ....
         ....
         DispatchQueue.global( ).sync {       //이런 상황도 괜찮음 (3번 쓰레드로 보낸 작업을 기다림)

         

         }
}


네, 그래서 제가 강의에서 말씀드리고자 했던 상황은.. 현재 메인에서 일을 하고 있다는 상황을 명확하게 가정하고자는 의도로 말씀드린 것이예요 :)

혹시나 이 부분에 대해서 이해가 안되시면 다시 말씀주세요!


(2번 질문에 대한 답변)======================================

해당 내용은... 보시면

DispatchQueue.global( ).async {       

         DispatchQueue.global( ).sync {  

         }
}


이런 코드에 대해서 말씀드리고 있습니다... 그래서


DispatchQueue.global( ).async { 
         // 작업을 DispatchQueue.global( ) 큐를 이용해서, 2번 쓰레드로 보내는 코드         

         DispatchQueue.global( ).sync { 

         // 작업을 DispatchQueue.global( ) 큐다시 이용해서, 2번 쓰레드로 보내는 코드      

         }
}


작업을 "동일한" DispatchQueue.global( ) 큐 로 보내고 있기 때문에,

이런 작업을 해서는 안된다는 취지로 말씀을 드리고 있는 것이고,... 


이것을 잘 생각해 보시면,

2번 쓰레드로 비동기적으로 보낸 작업을, 다시 2번쓰레드로 보내서 기다리기 때문에.. 

(3, 4, 5번 등 쓰레드로 보내는 것은 괜찮지만) 동일한 쓰레드로 보내질 가능성이 있기 때문에


DispatchQueue.global( ).async {       

         DispatchQueue.global( ).sync 

         }
}


이렇게 동일한 큐에서 동일한 큐로 동기적으로 보내는 것은 안된다는 취지에서 말씀드리고 있는 것이예요!

혹시나, 이해가 안되시면 다시 말씀주세요 :)


강의를 수강해 주셔서,

고맙습니다.