2016-08-06 3 views
0

사용자 개체가 array입니다. 이 배열을 반복 할 필요가 있고 각 사용자마다 사용자 ID를 기반으로 데이터를 가져 오도록 요청해야합니다. 이 요청은 비동기 요청입니다 (동기화 할 수없는 이유로). 첫 번째 요청이 완료되면, 사용자는 요청을 시작했다 사람이 아닌이있다 참조, 그래서 I :NSArray를 통한 동시성 반복

for (User *user in self.userList) { 
    dispatch_group_enter(self.usersGroup); 
    [self.wrapper getUserDataWithId:user.userid completion:^(Owner *owner, NSError *error) { 
     user.owner = owner; 
     dispatch_group_leave(self.usersGroup); 
    }]; 
} 

dispatch_group_notify(self.usersGroup, dispatch_get_main_queue(), ^{ 
    // All requests have finished 
    // Stuff with updated userlist 
}); 

주요 문제는 분명하다 편집을 할

: 여기에 전화를 dispatch_group 사용하여 편집 코드 올바른 연관성이 없습니다.

이 문제를 해결하기위한 쉽고 세련된 방법이 있습니까? 미리 감사드립니다!

+0

같은이 함수를 호출하기 때문에 소유자는 오른쪽 객체에 설정됩니다. 모든 요청이 완료 될 때까지 어떻게 기다리고 계십니까? – Paulw11

+0

블록은 id (문자열)에 대해서만 알고 있지만 사용자 객체에 대한 참조는 없습니다. 모든 요청이 완료 될 때까지 기다리는 dispatch_group을 시도했지만 리턴 된 배열에는 상관 데이터가 없습니다 –

+0

디스패치 그룹을 사용하여 시도한 코드를 추가하면 사람들을 도울 수 있습니다. – CRD

답변

0

마찬가지로 @ Paulw11 제안 루프는 당신이 블록을 실행하기를 기다리지 않을 것이므로 루프 대신 this와 같은 재귀 함수를 사용할 것을 제안합니다.

- (void)getOwnerForObectAtIndex:(NSInteger)index { 
    if (index < self.userList) { 
     User *user = [self.userList objectAtIndex:index]; 
     [self.wrapper getUserDataWithId:user.userid completion:^(Owner *owner, NSError *error) { 
      user.owner = owner; 
      [self getOwnerForObectAtIndex:index+1]; 
     }]; 
    } 
    else { 
     //Now all User have its corresponding owner, Handle array Now. 
    } 
} 

이제 블록은 user``의 값을 캡처이 [self getOwnerForObectAtIndex:0];

+0

dispatch_group을 사용해 보았지만 재귀 함수가 더 나은 해결책 일 수 있습니다. 감사!! –

+0

비동기 작업이 각 요소에 대해 시작된 후 OPs 루프가 완료되고 비동기 작업이 첫 번째 요소에 대해 시작된 후 재귀 솔루션이 반환되며 OP 작업이 완료 될 때까지 모든 작업이 완료 될 때까지 대기하지 않습니다. – CRD

+0

@CRD이 기능은 제대로 작동하지 않을 것입니다. 응답 확인을 마친 후에 다시 기능을 호출합니다. 블록 문은 응답을받는 경우에만 실행됩니다. –