0

我使用以下代碼成功地創建了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

回答

1

答案是創建一個NSTimer和無效它,每當一個新的按鍵已經作出。然後再次啓動它。

[timer invalidate]; 
0

你可以試試這個取消

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