Задержка, отмена или замена ASIFormDataRequest в NSOperationQueue (для окна поиска) - PullRequest
0 голосов
/ 21 апреля 2011

Я успешно делаю 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:)];

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

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

this

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

вызывает это

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

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

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

[timer invalidate];
0 голосов
/ 26 апреля 2011

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

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