остановка фонового выполнения до его запуска - PullRequest
0 голосов
/ 10 марта 2012

Я написал логику фоновой обработки с использованием 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 или нет, и если это так,затем я хочу остановить выполнение этого задания в очереди перед началом следующего блока. (хочу удалить предыдущий) Я использую это, чтобы пользовательский интерфейс приложения не выглядел так, как будто он завис, если пользователь вводит 3-4символы быстро (потому что результат приходит слишком поздно из моей базы данных)

1 Ответ

1 голос
/ 10 марта 2012

Вы можете использовать NSOperationQueue вместо своей очереди GCD и добавить операции, подобные этой:

[queue addOperationWithBlock:^{
    NSArray *tempArray = [myClass getSuggestionArray];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self initSuggestionArray:tempArray];
    });
}];

Затем вы можете отменить все свои операции с помощью

[queue cancelAllOperations];

Если вам нужен более точный контроль, вы можете создать подкласс NSOperation и добавить некоторые проверки, чтобы увидеть, была ли операция отменена.

...