1

我需要检索几个NSDicionaries,它们与id进行比较。在后台解析调用函数会扰乱订单序列

首先,我打电话给一个NSArray这些身份证。我正在循环他们以查看该ID的详细信息,以及我打电话给另一个pfcloud功能。直到这一点,一切顺利。然而,当我登录支付的id的付款细节,订单顺序是按不同的顺序比我的推杆它在阵列

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

因此,例如:success = @[@"1",@"2",@"3"]

方法getPaymentDetails会记录我@[@"details about 1", @"details about 3", @"details about 2"]

但是,我需要他们是在完全相同的顺序。 这是我的getPaymentDetails代码:

-(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); 
          } 

          }]; 
} 

存储在amountArray例如值,不匹配paymentId 怎么来的?我如何解决这个问题的指标?

+0

'__block'是没用的存在。 'paymentId'没有用于 – newacct 2014-09-01 05:51:54

回答

0

它可以更简单,只是将整个for循环进入后台,然后调用解析函数同步

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,你会叫callFunction:withParameters:error:,而不是callFunctionInBackground:withParameters:

这ISN”但是,由于您正在消除并发性,因此执行时间会更长。

更好的解决方案是应对事实阵列是在循环结束无序,一旦对它进行排序的所有数据被检索

0

请求callFunctionInBackground将执行的操作是异步执行的,并且不能保证您在循环中首次调用将首先完成。这与Parse本身没有什么关系,这就是这个过程的本质。每次执行此代码时,最终可能会出现重合或完全随机的顺序。

如果您希望订单保持不变,请将所有ID传递到您的云端功能,并更新您的云端功能以处理该端口,或者始终等待一个呼叫完成,将结果添加到您的阵列中,然后获取下一个ID(基本上是一个队列)的详细信息。

+0

谢谢比约恩!我如何创建这样一个队列? – bdv 2014-08-31 20:50:57

+0

这将超出评论线程的范围,而不是真正的原始问题的核心是什么,但是这里有一个基本的方法:你有一个数组,你想从中获取详细信息,然后拿到第一,做任何你需要做的事来获取细节,当你完成你从队列数组中删除该ID,检查是否有更多的ID,如果没有你完成,如果是的话,你调用的代码,提取细节再次。然后重复,直到队列(你的数组)是空的。 – 2014-08-31 21:06:33

+0

谢谢,我认为这是一个队列btw的基本原则,但你可能会指向我的一些方法或文档与此有关?我不知道该怎么做,因为我从来没有这样做过。 – bdv 2014-08-31 21:10:54