#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