2017-11-28 16 views
1

완료 처리기가있는 함수가 있고 Im 함수 내에 두 개의 개별 비동기 호출이 있습니다.다중 비동기 호출을 사용하여 디스패치 대기열 사용

그것에 대한 의사 같은 것입니다 :

func Foo(completion:()->()) { 
let dispatchGroup = DispatchGroup() 

for doc in documents { 
    dispatchGroup.enter() 
    ref.getDocument(completion: { (snapshot, error) in 
     //Need another getDocument call here 
     let Object = Object(init with snapshot data) 
     dispatchGroup.leave() 
    } 
    } 
    } completion() 

는 내가 뭘해야 내가 코멘트를 추가 한 다른 비동기 호출을 추가합니다. 같은 코드를 살펴 만들 것

:

ref.getDocument(completion: { (snapshot, error) in 
      userCountRef.getDocuments(completion: { (snap, error) in 
      let Object = Object(init with snapshot data) 
      dispatchGroup.leave() 
      } 
     } completion() 

코드의 두 번째 세트의 문제는 첫 번째 루프 내의를 통과 한 후 내 완료 핸들러가 호출되는 것입니다.

기본적으로 디스패치 그룹과 함께 두 세트의 비동기 호출을 처리 할 수 ​​있습니다. 첫 번째 호출이 필요하고 첫 번째 호출이 필요한 정보를 사용하여 두 번째 호출을 작성한 다음 클래스의 객체를 만들고 루프를 완전히 반복하여 반복 한 다음 매우 끝내 내 완성.

어떻게 수행 할 수 있습니까? 두 번째 비동기 호출이 처음에 따라 다르지만 다른 첫 번째 데이터가 ref 내의 다른 개체에서 호출하지 않는 경우

답변

2

, 다음이 작동합니다 :이 notify 모든 enter 's이 (가)이 있는지 확인합니다

func Foo(completion:()->()) { 
    let dispatchGroup = DispatchGroup() 

    for doc in documents { 
    dispatchGroup.enter() 
    ref.getDocument(completion: { (snapshot, error) in 
     userCountRef.getDocuments(completion: { (snap, error) in 
      let Object = Object(init with snapshot data) 
      dispatchGroup.leave() 
     } 
    } 
    } 

    // .main here is the main DispatchQueue. Can be any queue desired 
    dispatchGroup.notify(.main) { 
    completion() 
    } 
} 

completion으로 전화하기 전에 leave 마감과 일치했습니다. Apple docs here에서 자세한 내용을 확인하십시오.

+1

나는 이것을 정확하게하기 위해 노력하고 있었다. 그리고 단지 나의 브래킷이 축 늘어져 라. .. 도와 줘서 고마워, 고마워. – Noowoo