2010-11-28 4 views
2

こんにちはゲスト ユーザーが都市や国を検索する検索バーを探しています。その結果はオンラインAPIから得られます。iphone; uisearchbar非同期要求、新しいものを送信する前にキャンセルする

したがって、ユーザーが4文字以上を入力すると、オンラインAPIと国に検索要求が送信され、都市情報が取得されます。ここの問題は、ユーザーは通話作られていますが、その前にすべてのコールがまだ終了していないを入力しているよう -

  1. ユーザータイプを繰り返すが...アプリケーションがだるいさせる

    を、は「歌う言うことができます「

  2. リクエストが送信され、そしてそれで歌うのすべての都市が
  3. を取得している。しかし、リストが取得される前であっても、ユーザーが入力し続けて、 『まだシンガ』
  4. その結果を待ってのアプリケーションの種類を最初の要求から保留中であり、時には結果はそうです私はごみです。

私はあなたが私の意図したことを理解してくれることを願っています。保留中のリクエストをキャンセルして新しいリクエストを送信するだけで済みます。どうすればこれを達成できますか?

1つの方法は、ユーザーが「検索」をクリックしたときにのみリストを取得することですが、よりインタラクティブにしたいと考えています。

ありがとうございました

答えて

0

トリッキーワン! NSURLConnectionを使用していると仮定すると、新しい文字が入力されたことを検出すると、キャンセルメッセージ[urlConnection cancel]を送信します。新しいものを発射する前に?

+0

私はそれも考えています - 実装しようとします。私はこれが共通の問題であると考えていました。ボイラープレートソリューションがあります:) – Veeru

+0

どちらかの方法で興味深い質問があれば教えてください。 – Rog

+0

ありがとうございましたそれはどうやってすぐに結果を掲載するのか – Veeru

3

私はこの問題でいくつかの積極的な進歩を遂げました... NSURLCOnnectionを使用すると、前述のように、新しいリクエストを送信する前にキャンセルが実装されました。私のコードは次のように私のためにかなり良い仕事を

- (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 

です。

関連する問題