在NSOperationQueue中延迟,取消或替换ASIFormDataRequest(对于搜索框)

时间:2011-04-21 13:03:27

标签: 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
}

但是,如果用户继续输入,我还没有设法解决如何取消请求或不将请求放入队列,或清空队列并将其替换为新请求。

最后,显然我可以强迫用户等到他们按下弹出式键盘上的“搜索”按钮,但我希​​望不提供搜索结果。

由于

2 个答案:

答案 0 :(得分:1)

答案是创建一个NSTimer,并在每次按下新的按键时使其无效。然后重新开始。

[timer invalidate];

答案 1 :(得分:0)

您可以尝试取消

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