ios - 只有在方法完成时才继续循环

标签 ios objective-c multithreading concurrency

我有一个像这样的 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-createdispatch_semaphore_signaldispatch_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/

相关文章:

objective-c - 将对象添加到 NSMutableArray 时出现问题

ios - iTunes 连接 : Can't See Build

iphone - 堆栈上的透明 View

iphone - 将表情符号动态转换为 unicode

java - Thread.sleep() 不工作。被跳过的操作

python - 使用python子进程和线程播放声音

python - joblib 中的 batch_size 和 pre_dispatch 到底是什么意思

ios - 如何在应用程序加载时调用一个 xib?

ios - 使用 NSPredicate 按值过滤 NSDictionary

ios - 在 iCloud 中使用预先存在的 NSFileManager 代码