开发者

iphone; uisearchbar asynchronous requests, cancelling before sending a new one

开发者 https://www.devze.com 2023-01-27 11:36 出处:网络
Hi there guys I am looking to have a search bar in my application,where the user searches for cities and countries - the results come from an online API.

Hi there guys I am looking to have a search bar in my application,where the user searches for cities and countries - the results come from an online API.

So, when the user starts to type more than four characters, a search request is sent to the online API and country,city information is fetched. The problem here is; as the user is typing the calls are made, but any 开发者_开发问答call before that has not ended yet - causing the application to feel sluggish...

To reiterate

  1. The user types, lets' say "Sing"
  2. A request is sent, and all the cities with Sing in it are retrieved
  3. But even before the list is retrieved, the user continues typing "Singa"
  4. The application kind of waits for the results that yet pending from the first request and even at times, the results are some garbage.

I hope you guys understand what i meant, i just need to cancel any pending requests and send a new one. How can i achieve this?

One way is to retrieve the list only when the user clicks "search" - but i would like it to be more interactive.

Thanks


i had some positive progress with the issue... using NSURLCOnnection, as rog mentioned, implemented a cancel before sending a new request. My code is as follows

- (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&client_password=f@c3$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*/

    }   
}

That worked pretty good for me - a sample console output is

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

If you notice the request got cancelled as i inputted characters into the searchbar.


Tricky one! Assuming you're using NSURLConnection, once you detect a new character has been entered, send it a cancel message [urlConnection cancel]; before firing up the new one?

0

精彩评论

暂无评论...
验证码 换一张
取 消