iphone;uisearchbar асинхронные запросы, отмена перед отправкой нового - PullRequest
2 голосов
/ 28 ноября 2010

Привет, ребята. Мне нужно, чтобы в моем приложении была панель поиска, где пользователь ищет города и страны - результаты приходят из онлайн-API.

Итак, когда пользователь начинает вводить большечем четыре символа, поисковый запрос отправляется в онлайн API и страну, выбирается информация о городе.Проблема здесь в том;по мере того, как пользователь печатает, звонки сделаны, но все звонки до этого еще не закончились - из-за чего приложение чувствует себя вялым ...

Для повторения

  1. Пользователь печатает,скажем "Sing"
  2. Запрос отправлен, и все города с Sing в нем извлекаются
  3. Но даже до получения списка пользователь продолжает набирать "Singa"
  4. Приложение как бы ожидает результатов, которые еще ожидают от первого запроса, и даже порой, результаты являются мусором.

Надеюсь, вы, ребята, понимаете, что я имел в виду, я простонеобходимо отменить любые ожидающие запросы и отправить новый.Как мне этого добиться?

Один из способов - получить список только тогда, когда пользователь нажмет «поиск», но я бы хотел, чтобы он был более интерактивным.

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

У меня был некоторый положительный прогресс в этой проблеме ... использование 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&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*/

    }   
}

Это хорошо сработало для меня - пример вывода на консоль

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

Если вы заметили, что запрос был отменен, когда я ввел символы в строку поиска.

0 голосов
/ 28 ноября 2010

Хитрый! Предполагая, что вы используете NSURLConnection, как только вы обнаружите, что введен новый символ, отправьте ему сообщение об отмене [urlConnection cancel]; до запуска нового?

...