2010-11-28 80 views
2

嗨有朋友 我正在寻找在我的应用程序中有一个搜索栏,其中用户搜索城市和国家 - 结果来自在线API。iphone;在发送一个新的请求之前取消发件人的邮箱

因此,当用户开始键入四个以上的字符时,搜索请求会被发送到在线API和国家,城市信息被提取。这里的问题是;如用户键入的通话制造,但在此之前的任何呼叫还未结束 - 导致应用程序迟缓的感觉......

重申

  1. 的用户类型,让说“唱“
  2. 的请求被发送,并且所有Sing在它的城市中检索
  3. 但检索到的名单,甚至之前,用户继续输入‘辛加’
  4. 应用那种等待的对结果尚未等待第一次请求,甚至有时,结果如此我垃圾。

我希望你们明白我的意思,我只需要取消任何未决的请求并发送一个新的请求。我怎样才能做到这一点?

一种方法是仅当用户点击“搜索”时才检索列表 - 但我希望它更具互动性。

谢谢

回答

0

棘手的一个!假设你使用NSURLConnection,一旦你检测到一个新的字符被输入,发送一个取消消息[urlConnection取消];在启动新的之前?

+0

我会想到这一点 - 将尝试实施。我认为这将是一个普遍的问题,并会有一个锅炉板解决方案:) – Veeru 2010-11-28 06:47:19

3

我对此问题取得了一些积极进展...... 使用NSURLCOnnection,因为提到了rog,在发送新请求之前实现取消。我的代码如下

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if([searchText length]<4) return; 
    else{ 
     //[tableData removeAllObjects];// remove all data that belongs to previous search 
     //make the call 
     url=[NSString stringWithFormat:@"http://xml.customweather.com/xml?client=clinique_test&[email protected]$toF&product=search&search=%@",searchBar.text];  
     NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0]; 
     NSLog(@"%@",url); 
     if(connection!=nil){ //cancel if in process 
      NSLog(@"connection cancelled"); 
      [connection cancel]; 
     } 
     connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     NSLog(@"Making request"); 


    } 
} 

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData { 
    if (data==nil) { 
     data = 
     [[NSMutableData alloc] initWithCapacity:2048]; 
    } 
    [data appendData:incrementalData]; 


    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection { 
    NSString *res=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",res);   
    [connection release]; 
    connection=nil; 
    [data release]; 
    data=nil; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    /* MY custom function goes here*/ 

    } 
} 

这工作很适合我 - 一个样本控制台输出

2010-11-29 15:46:52.535 searchBar1[2931:207] Making request 
2010-11-29 15:46:52.678 searchBar1[2931:207] connection cancelled 
2010-11-29 15:46:52.690 searchBar1[2931:207] Making request 
2010-11-29 15:46:52.871 searchBar1[2931:207] connection cancelled 
2010-11-29 15:46:52.876 searchBar1[2931:207] Making request 
2010-11-29 15:46:53.063 searchBar1[2931:207] connection cancelled 
2010-11-29 15:46:53.069 searchBar1[2931:207] Making request 
2010-11-29 15:46:53.367 searchBar1[2931:207] connection cancelled 
2010-11-29 15:46:53.372 searchBar1[2931:207] Making request 
2010-11-29 15:46:53.529 searchBar1[2931:207] connection cancelled 
2010-11-29 15:46:53.535 searchBar1[2931:207] Making request 
2010-11-29 15:46:54.354 searchBar1[2931:207] <?xml version="1.0" encoding="UTF-8"?> 
<cw_citylist size="1" search_type="city"> 
<city id="75281" name="Singapore" state="" state_name="" country="SN" country_name="Singapore" lat="1.28" long="103.84" population="2930200" timezone="8" timezone_code="SGT" timezone_id="Asia/Singapore" localtime="Mon, 29 Nov 2010 15:50:43 SGT" region="Indonesia" weather_id="75281" /> 
</cw_citylist> 
2010-11-29 15:46:54.360 searchBar1[2931:207] Searching for ... city 
2010-11-29 15:46:54.364 searchBar1[2931:207] Found in Singapore, Singapore 
2010-11-29 15:46:54.368 searchBar1[2931:207] contacts error in num of row 
2010-11-29 15:46:54.374 searchBar1[2931:207] Array value is Singapore,Singapore 

如果您发现该请求被取消了,因为我输入的字符到搜索栏。

相关问题