티스토리 뷰

Tech/iOS

DispatchGroup 클래스

Ellie Kim 2019. 8. 9. 02:18

디스패치 그룹은 단일 장치와 같이 task들의 그룹을 모니터 하는 것입니다.

 

디스패치 그룹을 사용하게 된 이유는

여러 개의 request를 날렸고 response가 끝나는 시점을 잡아

한 번에 UI를 업데이트시키기 위해 DispatchGroup을 사용하게 되었습니다.

 

DispatchGroup을 사용하기 이전에는 어떻게 처리했냐면..

음 프로퍼티 옵서버를 사용했습니다.

didSet을 사용하면 프로퍼티가 변경된 바로 직후를 파악할 수 있어서 그냥 프로퍼티 옵저버를 사용했습니다.

 

다시 말해 API콜을 날리면 response데이터로 weatherInfo을 하나씩 받게 되고,

받은 데이터를 weather에 append 해주는 방식으로 처리했습니다. 

 

위와 같이 제가 초기에 구현했던 코드로 여러 reponse데이터를 받게 되면 어떻게 될까요?

 

weather에 하나씩 append될 때마다 tableView가 리로드 됩니다.

유저 입장에서는 테이블 뷰에 보이는 데이터가 한 개 두 개 세 개 이런 식으로 현란하게 업데이트되는 UI를 볼 수 있습니다.

어색한 상황이 발생해버리쥬.

 

이럴 때 

 

DispatchGroup을 사용할 수 있습니다.

 

디스패치 그룹은 DispatchObject를 상속받고 있습니다.

 

그룹을 사용하면 일련의 작업을 종합해 그룹의 동작을 동기화할 수 있습니다.

여러 작업 항목을 그룹에 붙이고 동일한 큐 또는 다른 큐에서 비동기로 실행되도록 합니다.

또한 모든 작업 항목의 실행이 완료되면 그룹은 완료 핸들러를 실행합니다. 

그룹의 모든 작업이 실행을 마칠 때까지 동기적으로 기다릴 수도 있습니다.

 

그룹을 업데이트시키는 방법입니다.

enter()은 그룹에 들어갔다고 알리는 것이며, leave()는 그룹을 떠났다고 알리는 방법입니다.

 

테스크 실행이 완료될 때까지 동기적으로 기다리게 하는 방법입니다.

그룹의 모든 테스크가 속성을 마쳤을 때 사용하는 방법입니다.

 

여기까지 간단하게 dispatchQueue는 어떻게 구성되어있는지 확인했습니다.

 

저는 didSet코드를 지우고

DispatchGroup을 사용했습니다.

 

 

위에 공식 문서에 맞게

API 호출이 있는 곳에 이제 그룹에 들어간다 알려줍니다.

dispatchGroup.enter()을 호출해줍니다.

API response가 도착할 때 그룹에서 나간다 알려줍니다.

dispatchGroup,leave()을 호출해줍니다.



저 같은 경우에는 여러 개의 request를 날리니까 rueqest 날릴 때마다 enter()이 호출되게 됩니다.

leave 또한 enter에 맞는 횟수로 호출되야합니다. 

아니면 앱이 크러쉬가 날 수 있습니다.

 

enter이 들어오고 leave가 되어 나가고 반복 뒤

더 이상 실행할 것들이 없고 끝났으면 그때 dispatchGroup.notify가 호출됩니다.

 

그럼 notify 안의 코드들이 실행하게 되겠죠.

weather에는 response데이터를 모두 받은 후에야 

테이블 뷰가 리로드 되어 한 번에 데이터를 보여줄 수 있게됩니다.

 

 

https://developer.apple.com/documentation/dispatch/dispatchgroup 

 

 

'Tech > iOS' 카테고리의 다른 글

DispatchSemaphore 클래스  (0) 2019.08.22
제네릭,프로토콜로 dequeueReusableCell 처리하기  (0) 2019.08.16
DispatchQueue 클래스  (0) 2019.08.08
iOS NavigationBar 색 변경  (0) 2019.07.11
UIImageView ContentMode 종류  (0) 2019.04.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
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
글 보관함