推迟,取消或替换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 
} 

但是,如果用户继续键入,我没有设法解决如何取消该请求或不放入队列请求,或空ŧ他排队并用新请求替换它。

最后,显然我可以强制用户等待,直到他们按下了弹出式键盘上的“搜索”按钮,但我希​​望能够提供没有该搜索结果的搜索结果。

感谢

+0

等一下......我已无法通过完全想到这一点?也许我只是简单地重写代码,直到打字停止后才发出请求。嗯......所以我真正需要的是一个等待一秒钟的线程,但每次重新按键时都重置自己! – 2011-04-21 13:06:18

+0

虽然我现在正在考虑使用NSTimer,但我仍然为此苦苦挣扎。有什么建议? – 2011-04-21 15:14:16

答案是创建一个NSTimer和无效它,每当一个新的按键已经作出。然后再次启动它。

[timer invalidate]; 

你可以试试这个取消

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