я написал логику обработки фона с помощью 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 символа быстро (потому что результат слишком поздно в моей базе данных)
Эй, я думаю, что операции не будут отменены, потому что initSuggestionArrayMethod получает вызов каждый раз, событие после отмены операции. Gdb показывает журналы как: void _WebThreadLockFromAnyThread (bool), 0x7a9cf60: получение веб-блокировки из потока, отличного от основного потока или веб-потока. UIKit не следует вызывать из вторичного потока. – anshul
Вы также можете использовать NSBlockOperation и проверить, было ли отменено до вызова initSuggestionArray, здесь вы можете найти пример: http://stackoverflow.com/a/8113232/381870 – tim