@escaping_2회독

hankyulee·2021년 9월 25일
0

closure

목록 보기
6/7

시간이 걸리는 task 이후에 어떤 일처리를 해야할 때가 있다. 예를들어 데이터를 불러온 후에 화면에 뿌릴때.
클로저는 특정 함수의 argument로 들어가서 그 함수를 벗어났을 때(escaping) 사용할 수 있다.
즉 scope의 개념이 무시된다. 지역변수 바깥에서 사용되는 꼴이므로.
클로저의 Escaping은 함수가 반환된 후 사용할 수 있다. 비동기 처리에서 필요할 것이다.
아직 아모르파이 를 통한 http통신은 공부하지 못했지만, restful api 를 통한 json데이터를 불러온 학습을 했었다. 이때 데이터를 요청하고 응답을 받는 상황에서 비동기적 처리를 한다. 즉 요청 명령을 한 후 바로 반환한다.
escaping closure를 통해 the response is used to screen.


200 과 199 가 출력된다. 여기서 말하고자 하는것은 escaping을 사용하면 클로저를 외부에서 사용 할 수 있다는것이다. 즉 함수가 반환된 이후에 사용할 수 있다.

이전에 공부한 것을 적용해 보자면, 여기에 나타난 함수는 클로저에서 자신을 참조한다. 즉 강한 순환 참조가 발생한다. 따라서 변수 mc에 nil을 할당해도 메모리가 해제되지 않는것을 확인할 수 있다. 따라서 약한 참조를 통해 다음과 같이 해결할 수 있다.

non escaping:
When passing a closure as the function argument, the closure gets execute with the function’s body and returns the closure back. As the execution ends, the passed closure goes out of scope and have no more existence in memory. 메모리에 없어졌기때문에 외부에서 사용할 수 없는것이다.
Suppose in the above scenario if we need those sorted numbers after the function return, then you have to mark it as @escaping closure else you will receive the following error. 예를들어 서버에서 데이터를 가져온 상태에서 화면에 데이터를 뿌릴때 escaping이 필요할 것이다.

  • 위와 같이 listener가 optional일 경우 escaping 없이 사용할 수 있음을 알 수 있다.. escaping으로 사용하고 싶을때는 optional 아닌 것으로 하면된다.

참고:https://medium.com/@dhavalkansara51/completion-handler-in-swift-with-escaping-and-nonescaping-closures-1ea717dc93a4,
apple공식문서
https://www.hackingwithswift.com/articles/179/capture-lists-in-swift-whats-the-difference-between-weak-strong-and-unowned-references

0개의 댓글