如何保持队列执行直到在 Objective-C 中从 Web 服务 API 获得响应
How to hold queue execution until get response from web service API in Objective-C
我将构建在数据库中具有动态大小记录的延迟加载功能,因此我将按照以下方式执行此操作
- 最初我取了 20 条记录,
- 然后我根据用户的点击处理一个、两个或任意数量的记录(我不会让用户等待完成某些服务调用或未决任务,因此用户可以对列表执行任何操作,例如滚动或单击等等)
现在为了保持一致性我先获取几条记录然后处理用户记录,我这样做是因为我处理的记录从实际记录列表中删除,所以这里的记录在数据库端和应用程序端不是固定列表。
我现在正在通过以下方式进行:
-(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];
}
}
我将构建在数据库中具有动态大小记录的延迟加载功能,因此我将按照以下方式执行此操作
- 最初我取了 20 条记录,
- 然后我根据用户的点击处理一个、两个或任意数量的记录(我不会让用户等待完成某些服务调用或未决任务,因此用户可以对列表执行任何操作,例如滚动或单击等等)
现在为了保持一致性我先获取几条记录然后处理用户记录,我这样做是因为我处理的记录从实际记录列表中删除,所以这里的记录在数据库端和应用程序端不是固定列表。
我现在正在通过以下方式进行:
-(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];
}
}