如果方法结束,只能继续循环
我有一个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-create
, dispatch_semaphore_signal
和dispatch_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