2013-09-05 2 views
0

두 개의 개체를 매핑하는 데 RestKit .20을 사용하고 있습니다. 두 번째 객체는 첫 번째 객체에 따라 다릅니다. 따라서 첫 번째 작업은 두 번째 작업 전에 수행되어야합니다. 작업이 완료되면 컨트롤러는 모델 개체를 사용하여 테이블 뷰에 적절한 정보를 표시합니다.iOS : RestKit 작업 블록을 실행하고 싶지 않을 때

첫 번째 개체에는 URL 요청의 일부를 구성하는 데 사용되는 고유 한 ID가 있습니다.이 ID는 첨부 된 개체를 가져 오는 데 사용됩니다. 그것의 모든 작동 및 요청 정보를 얻고 있지만 올바르게 매핑 작업을 수행하는 모든 잘못된 및 나는 단지 주위에 내 머리를 얻을 수 없습니다!

이 나는 ​​일이 원하는 것입니다 :

  1. 보기 부하를 첫 번째 객체를 매핑 /로드 시작합니다.
  2. 첫 번째 개체가로드되면 두 번째 개체가로드/매핑됩니다.
  3. 표보기가 새로 고침됩니다.

는 Heres는 어떻게되는지 :

  1. 보기로드 최대 부하 테이블보기를.
  2. 작업이 마지막으로 실행되고 블록 작업이 실행될 때마다 데이터가 다시로드됩니다. 원하는 솔루션이 아니라 작동시킬 수있는 유일한 방법입니다.

그것의 하드 나를 위해 그렇게 heres는 몇 가지 코드를 설명하기 :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self loadFirstObjects];   
    //omitted code 

} 



- (void)loadFirstObjects { 
    //omitted code 

    [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     self.pubRepos = mappingResult.array; 
     [self loadSecondaryObjects]; 
    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     NSLog(@"ERROR: %@", error); 
    }]; 

    [operation start]; 
} 

- (void)loadSecondObjects 
{ 
    for (FirstObject *firstObject in firstObjects) { 

     //Omitted code 

     [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
      SecondObject *secondObject = [mappingResult.array objectAtIndex:0]; 

      [secondObjects setObject:secondObject forKey:secondObject.idNum]; 
      [table reloadData]; 
     } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
      NSLog(@"ERROR: %@", error); 
     }]; 

     [operation start]; 

    } 
} 

그래서 어떻게이 내가 원하는대로 작동받을 수 있나요 (I 유엔 관련 코드를 할당한다 생략했습니다)? 요청/매핑을 먼저 수행 한 다음 모든 정보를 테이블에로드하고 업데이트 할 수 있기를 원합니다. 필자는 테이블을 다시로드하는 것과는 별도로 웹 서비스의 새 데이터를 지속적으로 다시로드하거나 매핑해야합니다.

그래서 가장 큰 질문은 다음과 같습니다. 작동 블록이 언제 실행되는지 정확히 제어하려면 어떻게해야합니까?

+0

"나는 중학교 아이오와 프로그래머이므로 놀아주세요.".... 경고 또는 요청 .. LOL ..! –

+0

나쁜 "stackoverflow 에티켓"에 용서를 요청하십시오 : D : D – leewaa

답변

1

다소 쉽게 이것을 수행하는 한 가지 방법은 dispatch_group을 사용하는 것입니다. 귀하의 -loadSecondObjects 방법은 다음과 같습니다

본질적으로
- (void)loadSecondObjects 
{ 
    dispatch_group_t group = dispatch_group_create(); 

    for (FirstObject *firstObject in firstObjects) { 
     // Omitted code 
     dispatch_group_enter(group); 
     [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
      SecondObject *secondObject = [mappingResult.array objectAtIndex:0]; 
      [secondObjects setObject:secondObject forKey:secondObject.idNum]; 
      dispatch_group_leave(group); 
     } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
      NSLog(@"ERROR: %@", error); 
      dispatch_group_leave(group); 
     }]; 

     [operation start]; 
    } 

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
     [table reloadData]; 
    }); 
} 

, 여기에서 일어나고 것은 당신이 때 카운터 실행하면 블록을 설정할 수있는 추가 기능과 함께 dispatch_group 등 편리한 카운터를 사용하고 있다는 것입니다 다음에 제로에 도달합니다. 카운터는 0에서 시작합니다. 시작하는 두 번째 객체로드마다 (dispatch_group_enter을 호출하여) 카운터를 증가시킨 다음 완료 (또는 실패)하는 모든 두 번째 객체로드에 대해 dispatch_group_leave을 호출하여 카운터를 감소시킵니다. 카운터가 0에 도달하면 dispatch_group_notify으로 설정 한 블록이 실행되고 그 시점에 모든 두 번째 오브젝트로드 작업이 완료되었음을 알 수 있습니다.

PS :/release-ish 코드를 호출하면 ARC를 사용하고 있다고 가정합니다. 그렇지 않다면 그룹 dispatch_release이 필요합니다.

+0

그것은 작동합니다! (그러나 당신은 이미 그것을 알고 있었다 : D) 고마워! – leewaa

관련 문제