Задержка, отмена или замена ASIFormDataRequest в NSOperationQueue (для окна поиска)

Я успешно делаю ASIFormDataRequest, используя приведенный ниже код.

    //get groups
    if (![self queue]) {
        [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
    }

    //make the url by appending the URL from the Constant class to the jsp name 
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", URL, @"connectors/searchGroupsServlet.jsp"]];

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request addRequestHeader:@"User-Agent" value:USER_AGENT];
    [request addPostValue:[login username] forKey:@"username"];
    [request addPostValue:[login password] forKey:@"password"];
    [request addPostValue:[searchText lowercaseString] forKey:@"query"];
    [request addPostValue:GROUP_FILTER_LIMIT forKey:@"limit"];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestDone:)];
    [request setDidFailSelector:@selector(requestWentWrong:)];

В настоящее время этот запрос выполняется при каждом нажатии клавиши, которое пользователь делает в поле поиска (введенный текст отправляется в запросе в качестве строки поиска). Однако вместо того, чтобы отправлять запрос при каждом нажатии клавиши, я хочу отложить запрос на секунду, чтобы пользователи могли вводить дополнительные символы в поле поиска до отправки запроса.

Я успешно создал поток, который ждет секунду, пока пользователи продолжают печатать (хотя, по общему признанию, я пока не уверен, что это лучший способ сделать это, но пока он работает)...

это

[self performSelectorInBackground:@selector(wait:) withObject:request];

называет это

-(void)wait:(NSString *)request
{
    [NSThread sleepForTimeInterval:1.00];
    [[self queue] addOperation:request]; //queue is an NSOperationQueue
}

но если пользователь продолжает печатать, мне не удалось решить, как отменить запрос или не ставить запрос в очередь, или очистить очередь и заменить ее новым запросом.

Наконец, очевидно, я мог бы заставить пользователей ждать, пока они не нажмут кнопку «поиск» на всплывающей клавиатуре, но я надеялся предоставить результаты поиска без этого.

Спасибо


person Andy A    schedule 21.04.2011    source источник
comment
Подождите... разве я не продумал это до конца? Может быть, я просто переделываю код, чтобы вообще не было никаких запросов, пока не прекратится печатать. Ммм... так что мне действительно нужен поток, который ждет секунду, но перезагружается каждый раз, когда снова нажимается клавиша!!   -  person Andy A    schedule 21.04.2011
comment
Я все еще борюсь с этим, хотя сейчас смотрю на использование NSTimer. Любой совет?   -  person Andy A    schedule 21.04.2011


Ответы (2)


Ответ состоял в том, чтобы создать NSTimer и аннулировать его всякий раз, когда было сделано новое нажатие клавиши. Затем запустите его снова.

[timer invalidate];
person Andy A    schedule 26.04.2011

Вы можете попробовать это, чтобы отменить

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument
person visakh7    schedule 26.04.2011