• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

애니메이션 질문입니다.

21.09.14 14:16 작성 조회수 96

1

비동기 함수와 관련된 작업들은 모두 컴플리션핸들러를 가지고 있는데,

4-2 애니메이션파트에서 completion부분이 escaping이 아닌것을 보았습니다. 그 이유는 무엇인가요?

혹시 애니메이션이 concurrency가 아닌 직렬에서 이루어지기 때문에 순서적으로 이루어져서인가요?

 

답변 1

답변을 작성해보세요.

1

네, 안녕하세요 한규님.

 

아래의 코드 부분에 대한 질문이 맞으시죠?





일단은, 말씀해주신대로 

“대략적인” 그런 이유로 @escaping키워드를 사용하지 않고 있다고 말씀드려야 할 것 같습니다.

 

대략적이라고 표현한 이유는.. , 

이 질문에 대해서는… 제가 정확하게 모든 내용을 인지시켜드리기는 한계가 좀 있다는 점을 좀 알아주시면 좋겠네요. ^^;  (제가 웬만하면.. 모든 질문에 대해 내용을 세세하게 답변드리는 것을.. 당연히 저도 선호하고 그것이 맞다고 생각을 하지만) 이 내용은 동시성 프로그래밍보다는 Swift문법과 관련되어서 @escaping 키워드가 왜 필요한지부터 설명을 드려야 하기 때문에 실제 이 내용부터 설명드리기에는 강의로만 2시간정도의 분량이 나올 것 같습니다.

그래서, 답변에 대한 디테일에는 조금 한계가 있다는 점을 알아주시면 좋겠고요,


그럼에도 불구하고 대략적인 내용에 대한 힌트를 드리자면,

@escaping 키워드가 왜 필요한지에 대한 내용을 잘 검색을 해보시면 될 것 같습니다.
(이 @escaping 키워드는 메모리 구조와 연관이 깊습니다.)

 

일반적으로 쓰레드 1개만 사용하는 구조에서는… 메모리도, 1개의 스택만 사용을 합니다. (1개의 쓰레드 => 1개의 스택)

(아래의 그림과 같은 구조)

 

 

 


그런데 2개이상의 쓰레드를 사용하면, 당연히 스택도 늘어납니다. (2개의 쓰레드 => 2개의 스택)
그래서 아래의 그림처럼 메모리 구조가 스택을 여러개 사용하는 방식으로 (스택이) 늘어나고.. @escaping키워드는 사실 어떤 함수의 실행을 다른 스택으로 보낸다는 의미 (원래의 함수의 실행을 벗어난다는 의미를 가지고 있습니다.)





, 그래서 위의 구조처럼 실제로 animations함수가 2번째 스택에서 실행이 일어나고.. (@escaping키워드로 이미 보내졌고) 이미 2번째 스택에서 일을하고 있기 때문에 다음 순차적으로 실행이 일어나는.. 콜백 함수의 역할을 하는 completion.. (이미 @escaping키워드로 animations 보내졌기 때문에) 다시 붙일 필요가 없는 것이긴 합니다.


, 정리해보자면
1
쓰레드에서 이미 @escaping키워드로 animations 2 쓰레드(2 스택)으로 보냈고.. 2번쓰레드의 내부에서 completion함수는 순차적으로 일어나는 일을 하고 있기 때문에 다시 다른 스택으 보낸다는 의미의 @escaping키워드를 붙일 필요가 없는 것입니다.

(
아래 구조)



비동기 처리가 아니고, 메모리구조에서스택 관련된 이야기를 자꾸 꺼내는지가 의아 하실 수도 있지만.. ( 내용이 비동기 처리는 맞지만) 정확하게 @escaping키워드와 관련된 내용을 이해하시려면, 실제로는 단순 비동기 처리 뿐만아니라, 비동기 처리 내부에서 일어나고 있는 메모리 구조는, @escaping키워드와 관련되어 있기 때문입니다.

이정도 내용으로 도움이 되시길 바랍니다.. :)


고맙습니다.

이한규님의 프로필

이한규

질문자

2021.11.07

지금 답변을 확인했습니다.. 이렇게 정성스레 써주신 줄도 모르고.
답변 감사합니다. 복 받으세요.