Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- iOS계산기
- ios
- 앱버전구하기
- 자바스크립트
- 개발기록
- Python
- FLASK
- Swift
- 파이썬서버
- MainScheduler
- customclass
- 스위프트
- 계산기앱만들기
- iOS앱배포
- Xib
- 맥
- 딩동말씀
- DispatchGroup
- JavaScript
- AJAX
- 웹
- spring
- 계산기앱
- subscript
- 스프링
- Xcode
- jQuery
- FileOwner
- 앱배포
- iOS배포
Archives
- Today
- Total
개발하는 뚝딱이
[iOS] DispatchGroup leave 에러 본문
오늘의 삽질은 소소한 것이라 다행이다!
func download() {
// ...
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
downloadImage { resultImage in
// do something
dispatchGroup.leave()
}
dispatchGroup.notify(queue: .main) {
// do something
}
// ...
}
func downloadImage(completion: @escaping (UIImage?) -> Void) {
// do something
}
DispatchGroup을 사용할 때, .enter()를 호출하면 .leave()가 호출될 때까지 .notify(:)함수는 호출되지 않는다.
.enter()와 .leave()는 한 쌍으로 동작하여, .enter()만 호출하고 .leave()를 호출하지 않으면 앱이 멈추고
.enter()는 호출하지 않았는데 .leave()를 호출하면 에러가 발생한다.
비동기 처리할 때 유용하단 장점이 있다. 특히, 여러 개의 비동기 처리가 모두 끝나고 작업을 수행해야 할 때 자주 쓰는 편이다!
그런데 개발하다가 dispatchGroup.leave()에서 크래쉬가 발생했다.
곰곰히 뭘까 고민해보았다! 일단 코드 상에는 문제가 없어보였지만, .leave()에서 크래쉬가 발생하니, 디버깅을 찍었다.
.enter()는 한 번 호출되었지만 .leave()는 2번 호출된게 문제였는데, 알고보니 downloadImage(completion:) 함수에서 completion을 두 번 호출하여, 클로저문이 두 번 실행되었던 것!
⚡️ 항상 completion처리 조심하기... 오늘의 교훈...
'오늘의 작은 삽질' 카테고리의 다른 글
[iOS] ~= 연산자 (0) | 2021.09.29 |
---|