推迟,取消或替换NSOperationQueue中的ASIFormDataRequest(对于搜索框)
问题描述:
我使用以下代码成功地创建了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
}
但是,如果用户继续键入,我没有设法解决如何取消该请求或不放入队列请求,或空ŧ他排队并用新请求替换它。
最后,显然我可以强制用户等待,直到他们按下了弹出式键盘上的“搜索”按钮,但我希望能够提供没有该搜索结果的搜索结果。
感谢
答
答案是创建一个NSTimer和无效它,每当一个新的按键已经作出。然后再次启动它。
[timer invalidate];
答
你可以试试这个取消
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument
等一下......我已无法通过完全想到这一点?也许我只是简单地重写代码,直到打字停止后才发出请求。嗯......所以我真正需要的是一个等待一秒钟的线程,但每次重新按键时都重置自己! – 2011-04-21 13:06:18
虽然我现在正在考虑使用NSTimer,但我仍然为此苦苦挣扎。有什么建议? – 2011-04-21 15:14:16