0

я написал логику обработки фона с помощью 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

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

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

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

[queue cancelAllOperations]; 

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

+0

Эй, я думаю, что операции не будут отменены, потому что initSuggestionArrayMethod получает вызов каждый раз, событие после отмены операции. Gdb показывает журналы как: void _WebThreadLockFromAnyThread (bool), 0x7a9cf60: получение веб-блокировки из потока, отличного от основного потока или веб-потока. UIKit не следует вызывать из вторичного потока. – anshul

+0

Вы также можете использовать NSBlockOperation и проверить, было ли отменено до вызова initSuggestionArray, здесь вы можете найти пример: http://stackoverflow.com/a/8113232/381870 – tim

Смежные вопросы