我使用dispatch_async编写了后台处理逻辑,如下所示:
- (IBAction)textFieldChanged:(id)sender {
dispatch_async(kBgQueue, ^{
NSArray *tempArray = [myClass getSuggestionArray]; //getSuggestionArray returns an array of objects from a database
[self performSelectorOnMainThread:@selector(initSuggestionArray:) withObject:tempArray waitUntilDone:YES];
});
}
如您所见,每次用户编辑文本字段时都会调用此方法(只要用户键入字母)。 kBgQueue定义为:
#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
我想要的是一些方法,一些逻辑,以便每当用户编辑该字段时,我可以检查此kBgQueue中是否已经排队的任务,如果是,那么我想停止执行该排队的作业在开始下一个块之前。(想要删除前一个块)我正在使用这个,以便应用程序的UI看起来不会挂起,如果用户快速输入3-4个字符(因为结果来得太晚)从我的数据库)
答案 0 :(得分:1)
您可以使用NSOperationQueue而不是GCD队列,并添加如下操作:
[queue addOperationWithBlock:^{
NSArray *tempArray = [myClass getSuggestionArray];
dispatch_async(dispatch_get_main_queue(), ^{
[self initSuggestionArray:tempArray];
});
}];
然后您可以使用
取消所有操作[queue cancelAllOperations];
如果你需要更细粒度的控制,你可以继承NSOperation并添加一些检查以查看操作是否已被取消。