DispatchGroup

7과11사이·2024년 2월 29일
1
post-custom-banner

DispatchGroup는 작년 프로젝트를 하면서 처음 들었다.
정확하게 이해하지 못했기 때문에 사용하지 않았던 기억이 있었는데, 이번 개인 어플을 만드는 과정에서 활용해야하는 상황이 생겼다.

다른 대안도 있었지만, 이전에 한번 pass한 경험도 있었고 조금이라도 어떻게 작동하는 친구인지 알게 되면 좋을 것 같아 글을 적어보고자 한다.


What is DispatchGroup?

개발 문서에는 아래와 같이 서술되어 있다.
"A set of tasks and synchronize behaviors on the group. You attach multiple work items to a group and schedule them for asynchronous execution on the same queue or different queues."

쉽게 정리하면 작업물 (work items)를 묶어서 동일하거나 다른 큐에 비동기적으로 실행할 수 있게 된다. 이름에서 유추 해보면 Group을 Dispatch(보낸다)하는 것인데, 개인적으로 유선 전화를 받고 지역별 순찰차를 배치해주는 Dispatch의 역할과 나름 비슷하게 생각하고 있다.

중요한 점은 비슷한 Dispatch로 시작하는 DispatchQueue는 어떤 스레드에 해당 작업 요청을 올리게 된다는 점이다. 따라서 요청은 각각 종료하는 시점이 다 다르게 발생하게 된다. 반대로 DispatchGroup는 하나로 묶어서 요청을 하게 되는 만큼 그룹으로 묶인 전체의 요청이 끝나는 시점에 알려주게 된다는 점이다.
그룹은 여러개로 나누어 진행할 수 있으니 참고하자!


어떻게 활용할까?

enter(), leave()를 활용해서 원하는 작업을 그룹으로 초대/내보내기가 가능하다.

notify(queue:)를 활용하면 그룹에 있는 작업이 모두 완료된 이후 내보내졌을 때 실행되는 클로저이다. 아래는 내가 정리해본 하나의 방법이다.
(깔끔한 정리는 나중에 완성되면 한번 해봐야겠다!)

@objc func actionButtonTapped() {
        let destinationVC = QuizVC()
        destinationVC.modalTransitionStyle = .crossDissolve
        destinationVC.modalPresentationStyle = .fullScreen
        
        let dispatchGroup = DispatchGroup() << 그룹 생성
        dispatchGroup.enter()				<< 그룹에 특정 task 초대
        upAnimatingView.move(to: .up) {		<< 초대된 task
            dispatchGroup.leave()			<< 실행 이후 종료
        }
        
        dispatchGroup.enter()
        downAnimatingView.move(to: .down) {
            dispatchGroup.leave()
        }
        
        dispatchGroup.notify(queue: .main) {	<< 그룹에서 모든 task가 종료된 이후 최종 실행 클로저
            self.present(destinationVC, animated: true)
        }
    }

나는 지금 이 방식으로 한 버튼 탭으로 동시에 움직이는 UIView를 만들어봤다.
내가 적용하고 싶던 방식에 가장 단순한(?) 방법인 것 같아 활용하고 있지만 동기, 비동기에서도 적용 가능한 DispatchGroup이 있다고 한다! 자칫하면 코드가 완전히 꼬일 수 있다고 하니 참고해야겠다.


참고 에러 케이스

post-custom-banner

0개의 댓글