苹果手机; uisearchbar异步请求,在发送新请求之前取消 [英] iphone; uisearchbar asynchronous requests, cancelling before sending a new one

查看:47
本文介绍了苹果手机; uisearchbar异步请求,在发送新请求之前取消的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好 我希望在我的应用程序中有一个搜索栏,用户可以在其中搜索城市和国家/地区-结果来自在线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.

因此,当用户开始输入四个以上的字符时,将向在线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...

重申

  1. 用户键入,让我们说唱歌"
  2. 已发送请求,并检索了其中所有带有Sing的城市
  3. 但是即使在检索列表之前,用户仍会继续键入"Singa"
  4. 该应用程序会等待第一个请求尚未完成的结果,有时甚至会浪费一些结果.

我希望你们能理解我的意思,我只需要取消所有待处理的请求并发送一个新请求即可.我该如何实现?

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.

谢谢

推荐答案

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

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.

这篇关于苹果手机; uisearchbar异步请求,在发送新请求之前取消的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆