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

#iphone #cocoa-touch #asihttprequest #nsthread #nsoperationqueue

#iPhone #cocoa-touch #asihttprequest #nsthread #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
}
  

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

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

Спасибо

Комментарии:

1. Подождите… я не продумал это полностью? Возможно, я просто переделываю код, чтобы запрос вообще не выполнялся, пока не прекратится ввод. Ммм … итак, что мне действительно нужно, так это поток, который ожидает секунду, но сбрасывает себя каждый раз при повторном нажатии клавиши!!

2. Я все еще борюсь с этим, хотя сейчас я рассматриваю возможность использования NSTimer. Есть какие-нибудь советы?

Ответ №1:

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

 [timer invalidate];
  

Ответ №2:

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

   (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument