2016-11-17 1 views
2

아래 예제 코드에서 나는 실패한 경우 complete(false)을 호출합니다. 그러나 DispatchGroup 개체를 사용하여 모든 비동기 요청이 완료되었는지 확인하기 위해 notify이 호출되어 complete(true)이 호출되어이 함수가 true을 반환하고 false을 반환해야하는 경우 오류가 발생하면 syncGroup.leave()을 호출 할 수 없습니다. 실패.DispatchGroup을 사용하여 for 루프 내에서 비동기 호출을 수행하는 방법

올바르게 기능을 완료하지 못하면 syncGroup.leave()을 호출하지 않는 것이 맞습니까? 아니면 syncGroup.leave()으로 전화해야하고 결과가 무엇인지 판단해야하므로 실패시 false을 반환 할 수 있습니까?

let syncGroup = DispatchGroup() 
syncGroup.enter() 
for track in unsynced { 
    register(time: time, withCompletion: { (success: Bool) ->() in 

     if success { 
      self.debug.log(tag: "SyncController", content: "Registered") 
      syncGroup.leave() 
     } 
     else { 
      complete(false) 
     } 
    }) 
} 

//all requests complete 
syncGroup.notify(queue: .main) { 
    self.debug.log(tag: "SyncController", content: "Finished registering") 
    complete(true) 
} 
+0

. 달성하고자하는 것을 고려해야합니다. 아마도 여러 콜백을받을 준비가되어 있어야합니다 (아마도 'track'과 true/false 결과를 전달할 것입니다). 또는 콜백을 한 번 호출하고 트랙/상태 배열을 전달하십시오. – Paulw11

답변

2

for 루프 내에 그룹을 입력해야합니다. 추가 오류 플래그를 도입하고자 할 수 있습니다.

예 구현 : 당신은 많은 작업을 파견하지만, 단 하나의 상태를 반환하기 때문에 귀하의 접근 방식은 결함이

var fail = false 
    let syncGroup = DispatchGroup() 

    for track in unsynced { 
     syncGroup.enter() 
     register(time: time, withCompletion: { (success: Bool) ->() in 

      if success { 
       self.debug.log(tag: "SyncController", content: "Registered") 
       syncGroup.leave() 
      } 
      else { 
       fail = true 
       syncGroup.leave() 
      } 
     }) 
    } 

    //all requests complete 
    syncGroup.notify(queue: .main) { 
     if fail { 
      complete(false) 

     } else { 
      self.debug.log(tag: "SyncController", content: "Finished registering") 
      complete(true) 
     } 
    } 
+0

어떻게 그 루프를 빠져 나갈 수 있습니까? 'unsynced'에서 나머지 객체들을 살펴 보았나요? '휴식'은 폐쇄 효과가 있기 때문에 효과가 없을까요? – toast

+0

수 없습니다. 루프가 비동기 작업을 트리거합니다. 대부분의 경우 (작업이 사용하는 시간과 'unsynced'의 수에 따라) 모든 등록 작업은 첫 번째 작업이 완료 블록이라고 부르기 전에 트리거됩니다. 'unsynced'에있는 많은 아이템들에 대해서'for loop'의 첫번째 코드로'if fail {break}'를 추가 할 수 있습니다. – shallowThought

+0

아, 고마워. 이러한 요청은 비동기식이지만 하나 또는 두 개의 요청을 전송하지 않을 수 있습니다. – toast

관련 문제