개발하는 뚝딱이

[iOS] DispatchGroup leave 에러 본문

오늘의 작은 삽질

[iOS] DispatchGroup leave 에러

개발자뚝딱이 2021. 9. 15. 22:39

 

 

오늘의 삽질은 소소한 것이라 다행이다!

 

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