首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台执行之前停止后台执行

在后台执行之前停止后台执行
EN

Stack Overflow用户
提问于 2012-03-10 17:09:47
回答 1查看 591关注 0票数 0

我已经使用dispatch_async编写了一个后台处理逻辑,如下所示:

代码语言:javascript
复制
- (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定义为:

代码语言:javascript
复制
#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

我想要的是一些方法,一些逻辑,这样每当用户编辑字段时,我就可以检查在这个kBgQueue中是否已经有一个排队的任务,如果是的话,那么我想在开始下一个块之前停止那个排队的作业的执行。(我想删除前一个)我使用这个是为了让应用程序的UI看起来不像是挂起的,如果用户快速输入3-4个字符(因为结果来自我的数据库太晚了)。

EN

回答 1

Stack Overflow用户

发布于 2012-03-10 17:18:40

您可以使用NSOperationQueue而不是GCD队列,并添加如下操作:

代码语言:javascript
复制
[queue addOperationWithBlock:^{
    NSArray *tempArray = [myClass getSuggestionArray];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self initSuggestionArray:tempArray];
    });
}];

然后,您可以使用以下命令取消所有操作

代码语言:javascript
复制
[queue cancelAllOperations];

如果您需要更细粒度的控制,您可以子类NSOperation并添加一些检查,以查看操作是否已被取消。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9645239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档