如何保持队列执行直到在 Objective-C 中从 Web 服务 API 获得响应

How to hold queue execution until get response from web service API in Objective-C

我将构建在数据库中具有动态大小记录的延迟加载功能,因此我将按照以下方式执行此操作

  1. 最初我取了 20 条记录,
  2. 然后我根据用户的点击处理一个、两个或任意数量的记录(我不会让用户等待完成某些服务调用或未决任务,因此用户可以对列表执行任何操作,例如滚动或单击等等)

现在为了保持一致性我先获取几条记录然后处理用户记录,我这样做是因为我处理的记录从实际记录列表中删除,所以这里的记录在数据库端和应用程序端不是固定列表。

我现在正在通过以下方式进行:

-(void)viewDidLoad {
    // Here i fetch first 20 records and then show in UITableView
   // After user see the list he can click on any button to process that records
 // And i am trying to queue that service call and maintain consistency in records

}
-(void)processOneRecord {
    dispatch_queue_t queue = dispatch_queue_create("com.developer.serialqueue", DISPATCH_QUEUE_SERIAL);

    dispatch_sync(queue, ^{
        // To get further records service call

        [self getMoreRecordsCompletionBlock:^{
            [self ProcessOneRecordServiceCall];
        }];
    });
}

我在这里创建了一个方法 processOneRecord,每次用户单击单元格上的按钮时都会调用该方法

在 processOneRecord 方法中,我为第一次服务调用创建了完成块,因此第二次服务调用肯定 运行 在第一次服务所有响应之后。但是现在,当用户单击另一个单元格上的按钮时,我想等待第一个服务调用,直到第二个服务调用响应 return 到应用程序。

感谢大家的回复。

我在 Rob 的 回答的帮助下实现了所需的功能,我创建了一个函数,我在其中编写了一个 NSBlockOperation,后来我将其添加到 NSOperaiotnQueue。每次调用此函数时,我都会欺骗之前添加的操作是否已完成,如果是,则添加另一个操作,否则它将等待之前的操作直到完成。

在下面的代码片段中,下面的变量是我当前 UIViewController 的全局变量,并且它们也在我的 UIViewController 的 ViewDidLoad 和其他相应方法中初始化。

Bool             isRecordProcessed, isLoadMoreCallFinihsed;
NSOperationQueue *operationQueue;

-(void)callTwoAPIServiceCalls {

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        // To get further records first

        [self getMoreRecordsCompletionBlock:^{
            [self ProcessOneRecordServiceCall];
        }];
    }];

    if (operationQueue.operations.count == 0 && isRecordProcessed && isLoadMoreCallFinihsed) {
        [operationQueue addOperation:operation];
    }
    else {
        [self performSelector:@selector(callTwoServiceCalls:) withObject:nil afterDelay:0.1];
    }

}