1

내 사전의 모든 값이 반복되면 Dispatch Group을 사용하여 함수를 호출합니다. 각 항목의 블록 시작 부분에 enter()으로 전화 한 다음 끝에 leave()으로 전화하십시오. 나는 각 항목의 코드 블록 끝에 디스패치 그룹의 notify 콜백을 넣을 것이지만 모든 항목이 끝난 후에 대신 항목이 완료 될 때마다 콜백이 실제로 호출되는지 궁금합니다. 여기에 내가 가진 무엇 : 이러한 항목 중 일부는 동 기적으로 수행하는 것 때문에발송 그룹 불량 게재 위치를 알리시겠습니까?

for value in snap { 
    self.dispatchGroup.enter() 
    let petName = value.key as! String 
    self.petsDict[petName] = UIImage() 

    // Check if pet's image is cached, otherwise fetch from db 
    if let petImg = petName.pngImageInDocumentsFolder() { // Image is cached 
     print("Image is cached \(petName)") 
     self.petsDict[petName] = petImg 
     self.dispatchGroup.leave() 
    } else {            // Image not cached, fetch it 
     let imgRef = FIRStorage.storage().reference().child("profile_images").child(petName+".png") 
     imgRef.data(withMaxSize: 1 * 1024 * 1024) { (data, error) -> Void in 
      if error != nil { 
       print(error?.localizedDescription ?? "") 
       self.dispatchGroup.leave() 
      } else if let data = data, let image = UIImage(data: data){ 
       self.petsDict[petName] = image 
       self.dispatchGroup.leave() 
      } 

     } 
    } 
    self.dispatchGroup.notify(queue: DispatchQueue.main, execute: { 
     self.loadScrollView() 
    }) 
} 

(자신의 이미지가 캐시 인 경우) 나는 다음 항목의 루프도 디스패치 그룹의 leave()가 호출 될 때부터 시작하지 않을 것이라고 생각하고, 따라서 notify이 호출됩니다.

대신이 for 루프가 시작되기 전에 enter()을 별도로 두어야합니까? 모든을 처리하기 위해 모든 항목 루프가 최소한 시작된 후에 leave()의 마지막 부분을 계산해야합니까?

편집 : 콜백 함수에 print 문을 넣고 두 번 이상 호출되는 것을 확인했습니다 나는 누군가가 더 좋은 것을 가지고 있지 않다면 위의 해결책으로 갈 것이라고 생각한다.

답변

2

코드에 notify이 루프 안에 있습니다. 시신은 for-in이어야합니다.

코드는 잘 작동 : 모든 동기 호출이있는 경우

  • - 즉시 전화를 통지 - 괜찮아, 당신의 처리가 일부 비동기 호출이있는 경우
  • 종료 -의 마지막까지 대기 통지 마지막으로 완료 할 때까지 루프 항목 당 enter