Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在后台执行之前停止它_Ios_Multithreading_Objective C Blocks_Background Process - Fatal编程技术网

Ios 在后台执行之前停止它

Ios 在后台执行之前停止它,ios,multithreading,objective-c-blocks,background-process,Ios,Multithreading,Objective C Blocks,Background Process,我使用dispatch_async编写了一个后台处理逻辑,如下所示: - (IBAction)textFieldChanged:(id)sender { dispatch_async(kBgQueue, ^{ NSArray *tempArray = [myClass getSuggestionArray]; //getSuggestionArray returns an array of objects from a database [self performSel

我使用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个字符(因为我的数据库的结果来得太晚)

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

[queue addOperationWithBlock:^{
    NSArray *tempArray = [myClass getSuggestionArray];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self initSuggestionArray:tempArray];
    });
}];
然后,您可以使用取消所有操作

[queue cancelAllOperations];

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

嘿,tim,我认为操作没有被取消,因为每次都会调用initSuggestionalRayMethod,即取消操作后的事件。gdb将日志显示为:void\u WebThreadLockFromAnyThread(bool),0x7a9cf60:从主线程或web线程以外的线程获取web锁。不应从辅助线程调用UIKit。您还可以使用NSBlockOperation并在调用initSuggestionArray之前检查是否已取消,您可以在此处找到一个示例: