我有一个像这样的 for/in
循环:
for(NSString *paymentId in success){
[self getPaymentDetails:paymentId];
}
getPaymentDetails
方法是异步的。如何创建一个完成 block 以仅在方法完成时继续 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);
}
}];
}
这里定义“finished”的定义是当数组中存储了金额和货币时。或者换句话说:当代码块到达特定 paymentId
最佳答案
您可以使用信号量来实现这种同步。信号量是并发的基本构建 block ,并提供非忙等待等功能。 GCD通过dispatch_semaphore-create
、dispatch_semaphore_signal
和dispatch_semaphore_wait
提供信号量。
总体来说,首先创建一个信号量:
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
}
然后在背景 block 中的适当位置用以下命令完成信号:
dispatch_semaphore_signal(sema);
有关 API 的更多详细信息,请参阅手册(man
命令),有关信号量的信息,请查找书籍(或互联网)。
HTH
关于ios - 只有在方法完成时才继续循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597081/