1

id와 비교되는 NSDicionaries 몇 개를 검색해야합니다.백그라운드에서 구문 분석 함수를 구문 분석합니다.

먼저이 ID가 포함 된 NSArray을 호출합니다. 나는 그 id의 세부 사항을보기 위해 그들을 반복하고있다. 그리고 나는 또 다른 pfcloud 함수를 호출하고있다. 이 시점까지 모든 것이 잘 진행됩니다. 내가 지불 아이디의의 결제 세부 정보를 기록하고 있습니다 그러나, 주문 순서는 내가 그것을 퍼트 배열과는 다른 순서입니다 예를 들면 그래서

for(__block NSString *paymentId in success){ 
    [self getPaymentDetails:paymentId]; 
} 

:. success = @[@"1",@"2",@"3"]

방법 getPaymentDetails이 (가) 내게 로그인 할 것입니다. @[@"details about 1", @"details about 3", @"details about 2"]

그러나 정확한 순서로 입력해야합니다. 인스턴스에 대한 amountArray에 저장

-(void)getPaymentDetails:(NSString *)paymentId{ 
PFUser *currentUser = [PFUser currentUser]; 
    [PFCloud callFunctionInBackground:@"getpaymentdetails" 
        withParameters:@{@"objectid": paymentId, @"userid": currentUser.objectId} 
           block:^(NSDictionary *success, NSError *error) { 
           if(success){ 
           NSDictionary *payment = success; 
           NSString *amount = [payment objectForKey:@"amount"]; 
           if (![amount isKindOfClass:[NSNull class]]) { 
           [self.amountArray addObject:amount]; 
           } 
           else { 
           [self.amountArray addObject:@""]; 
           } 

           NSString *from = [payment objectForKey:@"from"]; 
           if (![from isKindOfClass:[NSNull class]]) { 
           [self.fromArray addObject:from]; 
           } 
           else { 
           [self.fromArray addObject:@""]; 
           } 

          } else{ 
           NSLog(@"Error logged getpaymentdetails: %@", error); 
          } 

          }]; 
} 

값 와서 나는이 문제를 어떻게 해결합니까 어떻게 paymentId 의 인덱스를 일치하지 않는, : 이 내 getPaymentDetails 코드는?

+0

'__block'이 쓸모가 검색되었습니다 배열은 루프의 결론에서 정렬되지 않은 사실에 대처 한 번 모든 데이터를 정렬 할 수 있습니다. 그 'paymentId' 블록에서 사용되지 않습니다 – newacct

답변

0

그냥 기적

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_group_t group = dispatch_group_create(); 


dispatch_group_async(group,queue, ^{ 

    for(__block NSString *paymentId in success){ 
     [self getPaymentDetails:paymentId]; 
    } 

}); 

dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 

// Release the group when it is no longer needed. 
dispatch_release(group); 

그런 다음에 getPaymentDetails 당신이 callFunctionInBackground:withParameters:

이 ISN '대신 callFunction:withParameters:error: 부를 것이다 구문 분석 기능을 배경으로 루프 전체를 이동 한 후 전화를 간단하게 할 수있다 그러나 동시성을 없애고 실행하는 데 더 오래 걸리는 이상적인 솔루션입니다.

더 나은 솔루션

0

callFunctionInBackground 요청은 비동기 적으로 실행되며 루프에서 첫 번째 호출이 먼저 완료된다는 보장이 없습니다. 이것은 Parse 자체와 실제로 관련이 없으며, 이것이 어떻게 수행되는지의 본질 일뿐입니다. 이 코드를 실행할 때마다 우연히 또는 동일한 임의의 순서로 같은 순서로 끝날 수 있습니다.

주문을 동일하게 유지하려면 모든 ID를 클라우드 기능에 전달하고 클라우드 기능을 업데이트하여 처리하거나 항상 하나의 통화가 완료 될 때까지 기다린 다음 결과를 배열에 추가 한 다음 다음 ID (기본적으로 대기열)에 대한 세부 정보

+0

감사 Bjorn! 어떻게 이러한 대기열을 만들 수 있습니까? – bdv

+0

코멘트 스레드에서 범위를 벗어나 원래 질문의 핵심은 아니지만 기본 접근법이 있습니다. 세부 사항을 얻고 자하는 ID가있는 배열을 가지고 있다면, 첫 번째 것은 세부 사항을 얻기 위해해야 ​​할 일을하고 큐 배열에서 해당 ID를 제거한 후에 더 많은 ID가 있는지 확인합니다. 완료되지 않은 경우 ID 코드를 가져 오는 코드를 호출합니다. 세부 사항. 그런 다음 대기열 (배열)이 비어있을 때까지이를 반복합니다. –

+0

고마워요, 그게 큐 btw의 기본 원리라고 생각하지만, 어쩌면 저와 관련된 어떤 방법이나 문서를 가르쳐 주시겠습니까? 나는 이것을 한 번도 해 본적이 없기 때문에 이것을하는 법을 모른다. – bdv