• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

sync이지만 Queue에 넣으면 async로 동작한다는 말의 의미

23.04.22 15:20 작성 조회수 462

0

안녕하세요 앨런님!

오퍼레이션큐 강의를 듣다가 혼동되는 개념이 있어서 질문합니다

큐의 종류를 정리하실 때 크게 GCD와 OperationQueue로 나누는걸로 보입니다.

그렇다면 Operation은 OperationQueue에서 다루는 작업의 단위로 이해가 되는데, GCD에서는 작업의 단위가 무엇인가요?

 

또, Operation.start()는 동기적으로 동작하지만,

OperationQueue.add(operation)을 하면 operation이 비동기적으로 동작한다고 하셨는데

이 말은 Operation이 Queue에 들어가지 않고도 수행될 수 있다는 말인가요??

그렇다면 GCD에서 사용하는 작업의 단위도 DispatchQueue에 들어가지 않고 작업을 수행할 수 있나요??

 

아직 개념이 머릿속에 정리되지 않아 질문 자체도 혼동 스럽지만 답변 부탁드리겠습니다..ㅎㅎ

답변 1

답변을 작성해보세요.

0

네 안녕하세요 04fud27 님.

(1) 작업 단위
1) OperationQueue 작업 단위 ➞ 오퍼레이션(작업 객체) (그러나, BlockOperation사용시 클로저 단위로도 가능)
2) GCD 작업 단위 ➞ 당연히 클로저 입니다.

DispatchQueue.global().async { 작업 단위 }

위의 코드가 생각나시죠? 글로벌큐로 비동기적으로 보내는 뒤의 중괄호 부분의 클로저가 작업 단위라고 보시면 됩니다.


(2) Operation의 수행 관련
네, Operation 자체는 어떤 작업을 클래스로 묶어놓은 단위라고 생각하시면 됩니다. 정말 쉽게 이야기 하자면 print("출력하기") 와 같은 간단한 (어떠한) 작업도 (오퍼레이션큐에 넣어서 활용하기 위해) 클래스로 단위화 시킬 수 있다고 보시면 됩니다.
그리고 그 자체는 그냥 작업(일)이기 때문에, 일반적인 print("출력하기") 와 동일하게 Operation.start( ) 이렇게 오퍼레이션큐에 넣지 않고도 동기적으로 작업을 시킬 수 있습니다. (그냥 프린트와 똑같은 일이라고 생각하시면, 아.. 그냥 실행시키면 당연히 동기적으로 일하겠구나라고 간단하게 생각하시면 됩니다. 너무 어렵게 생각하실 필요 없습니다.)
그래서, 오퍼레이션의 경우 일반적으로는 당연히 오퍼레이션큐에 넣어서 사용하겠지만, 큐에 안 넣고도 실행이 가능하긴 합니다.


(3) GCD작업 단위도 DispatchQueue에 넣지 않을 수 있는지
1번 답변에서 말씀드렸지만, GCD작업 단위는 클로저 입니다. (중괄호 함수)
위의 1번 답변에서 이미 파악 하셨겠지만, 아래 코드 처럼 당연히 DispatchQueue에 넣지 않을 수 있겠죠.

print("출력하기")

다만, 이렇게 사용하는 일은 없겠죠. 왜냐면, 비동기적으로 일을 시키고 싶기 때문에 DispatchQueue를 사용하는 것일 테니까요.
우리는 일반적으로 아래 처럼 사용하겠죠. (물론 쉽게 설명드리기 위해 print예시를 드린 것이고, 일반적으로 networking과 같이 오래 걸리는 일을 다른쓰레드에서 시키고 싶을 때 사용하죠.)

DispatchQueue.global().async {
     print("출력하기")
}



감사합니다. :)

04fud27님의 프로필

04fud27

질문자

2023.04.24

머릿속에 애매한 부분이 있었는데 덕분에 명확하게 이해가 된거 같아요!

정성스런 답변 감사합니다 :)