앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
GCD사용시 주의해야할 사항 (weak/strong 캡처 주의) (문법 - 179강)
com()이 붙는이유
79
작성한 질문수 9
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 앨런님 ! 혹시 강의 준 문법 179강에서 아래와 같은 예시를 들어주셨는데요!
func doSomething(com: @escaping(Void) -> Void) {
DispathchQueue.global().async {
print("프린트시작")
sleep(3)
print("프린트 종료")
com()
}
}
print("1")
doSomething()
print("2")
해당 함수에서 꼭 com()컴플리션 핸들러가 들어가야 하나요? 아니면 해당 예시에서는 없어도 되는 걸까요?
답변 1
0
네 안녕하세요 미래님.
func doSomething(com: @escaping () -> Void) {
DispatchQueue.global().async {
print("프린트시작")
sleep(3)
print("프린트 종료")
com()
}
}이런 함수 예시를 만드셨고, 아래 처럼 이 함수를 실행시켜보고 계시네요.
print("1")
doSomething {
print("일의 종료 시점을 알고 싶음")
}
print("2")
com( ) 이 부분은 결국에... com이라는 이름을 가진 함수 형태의 파라미터 타입 "@escaping () -> Void" (이런 형태)의 함수를 실행시키는 거죠. (즉, 해당 시점에 com으로 전달된 함수를 실행시켜서 시점을 알려고 하거나, (목적에 따라서) 데이터를 전달할 수 도 있죠.)
즉, 다시 말씀드리면 결국에 아래의 코드는 2번 쓰레드(CPU) 한테 일을 시키는 코드이고,
DispatchQueue.global().async {
print("프린트시작")
sleep(3)
print("프린트 종료")
com()
}어떤 시점에 일이 끝날지 모르기 때문에... 해당일이 끝나는 시점을 알고 싶어서 (어떻게 보면 com 파라미터로 전달된 콜백함수를) 호출해서 그 시점을 알려고 하는 거죠.
그래서 예를 들어서 제가 위에 써놓은 것처럼
doSomething {
print("일의 종료 시점을 알고 싶음")
}이렇게 하면.. 실제 2번 쓰레드에 시킨 일의 종료 시점이 정확하게 언제인지 알 수 있는 것이고요.
그런데 만약에 다른 예를 들어서.. 예제를 살짝 바꾸어서
func doSomething(com: @escaping (UIImage) -> Void) {
DispatchQueue.global().async {
let image = 서버에서이미지를가져오는함수호출()
com(image)
}
}이런식으로 생각해본다면.. 이미지를 가져오는.. 오래걸리는 일을 2번 쓰레드(CPU)에 시키고.. (당연히 받아온 이미지를 사용해야 될테니) 그 시점에 받아온 이미지를 전달하면서 com(image) 콜백함수를 이렇게 호출해줘야 이미지를 전달 받아서 사용할 수가 있겠죠.
doSomething { (image: UIImage) -> Void in
// image를 서버에서 받아와서 전달 받는 시점..
}
그리고 컴플리션핸들러(completionHandler)라는건, 일반적으로 콜백함수로 주로 사용하는 파라미터 이름을 애플에서 많이 붙이는 이름이고, 이름에서도 알 수 있듯이, "어떤 (비동기) 함수의 실행이 완료가 되는 시점에 그 완료(completion)를 처리(handle)하겠다"는 이름을 사용했을 뿐이예요.
저 예시에서는 com( )이 없어도 되냐?라고 물어보시면 정답은 없지만 (붙여도 되고, 안 붙여도 상관없지만.. 왜냐면 여기서는 오래걸리는 일이 끝난 후 뭔가 데이터가 생겨서 전달하지는 않으니까.. ) 그래도 그럼에도 불구하고 일반적인 구현 관점에서보면.. 당연히 2번 쓰레드(CPU)한테 오래 걸리는 일을 시켰으니.. 정확히 그 일을 끝나는 시점을 알려고 하는게 일반적인 구현의 형태이겠죠.
답변이 되셨을까요? 궁금하신 부분이 있으면 또 질문주세요 !
제가 봤을땐 비동기가 문제가 아니고.. 일단 아래와 같은 기본적인 형태인.. (doSomething)함수의 파라미터로 왜 함수 타입을 쓰는지 / 콜백함수가 뭔지를 먼저 이해하시는게 필요한 것 같아는 보입니다.
func doSomething(com: () -> Void) {
print("프린트 시작")
print("프린트 중간")
com()
}
doSomething {
print("프린트 종료")
}
고맙습니다 :)
수강연장부탁드려도될까요..
0
42
2
Drawing Cycle 관련 질문
0
72
1
앱 제작 시 주로 코드로 작성하시는 이유가 있을까요?
0
95
2
델리게이트 패턴 관련 질문
0
66
2
수강 기간 연장 부탁드릴 수 있을까요?
0
61
1
활용 앱 57강 질문입니다.
0
55
1
활용 앱 30강 에러 질문입니다
0
64
2
기초앱 17강 Contraints 설정 질문입니다.
0
67
2
기초 앱 4강 Type Any -> UIButton
0
66
2
34강 유용한 앱 추천에 나오는 UIKitViewer에 대해서 질문이 있습니다
0
78
1
깃에 코드는 올려도 된다고 하셨는데
0
109
1
수강기간 연장신청 드려도 될까요?
0
82
1
수강 기간 연장 부탁드려도 될까요?
0
120
2
수강 기간 연장 신청 요청드립니다.
0
131
2
playground에서 상단 실행?아이콘 회전 관련하여...
0
136
1
활용앱53강에서 질문있습니다.
0
164
2
Project 명칭 변경방법이 궁금합니다.
0
140
1
override 에 대해서 궁금한 것이 있습니다.
0
124
2
섹션8] 코드 리팩토링 문의
0
99
1
xcode 에서 ios 버전 선택 및 시뮬레이터 관련 질문
0
566
2
수강 기간 연장 부탁드려도 될까요?
0
130
2
뷰모델의 상태변화 와 didSet
0
98
1
@Sendable 키워드
0
94
1
클로저
0
105
2





