如果方法结束,只能继续循环

我有一个for/in循环,如下所示:

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

getPaymentDetails方法是asynchronous的。 如果方法已经完成,我如何创build一个完成块来只继续for / in循环?

  • 细节

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 *currency = [payment objectForKey:@"currency"]; if (![currency isKindOfClass:[NSNull class]]) { [self.currencyArray addObject:currency]; } else { [self.currencyArray addObject:@""]; } [self.tableView reloadData]; } else{ NSLog(@"Error logged getpaymentdetails: %@", error); } }]; } 

当数量和货币已经存储在数组中时,“完成”的定义在此定义。 或者换句话说:当代码块已经达到该特定paymentId的方法的paymentId

您可以使用信号来进行这种同步。 信号量是并发性的基本组成部分,并提供非繁忙的等待。 GCD通过dispatch_semaphore-createdispatch_semaphore_signaldispatch_semaphore_wait提供信号量。

在非常一般的大纲中首先创build一个信号量:

 dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

然后在你的循环中等待这个信号量:

 for(NSString *paymentId in success) { [self getPaymentDetails:paymentId]; dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); // wait for call to signal completion } 

然后在适当的地方在你的后台块信号完成:

 dispatch_semaphore_signal(sema); 

有关API的更多细节,请参阅手册( man命令),信号量查找书籍(或互联网)。

HTH