ASIHTTPRequest вызывает сбой после прерывания интернет-соединения - PullRequest
0 голосов
/ 08 июля 2011

Я использую ASIHTTPRequest для загрузки данных из Интернета.Если я теряю подключение к Интернету и пытаюсь загрузить данные, приложение вылетает.

Код:

- (IBAction)load:(id)sender { 
    if ([act isAnimating]) {
        NSLog(@"Request already being processed!");
    }
    else {
    ASINetworkQueue *queue = [ASINetworkQueue queue];
    ASIHTTPRequest *usdRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=CADUSD=X&f=l1"]];
    ASIHTTPRequest *eurRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=CADEUR=X&f=l1"]];
    ASIHTTPRequest *dateRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=CADEUR=X&f=d1"]];
    ASIHTTPRequest *timeRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=CADEUR=X&f=t1"]];

    [queue addOperation:usdRequest];
    [queue addOperation:eurRequest];
    [queue addOperation:dateRequest];
    [queue addOperation:timeRequest];

    [queue setQueueDidFinishSelector:@selector(parseLoadedData:)];
    [queue setRequestDidFinishSelector:@selector(requestLoaded:)];
    [queue setDelegate:self];
    [queue go];
    [act startAnimating];
    }
}

- (void)requestLoaded:(ASIHTTPRequest *)request {
     if([[request url] isEqual:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=CADUSD=X&f=l1"]]) {
        usdString = [[request responseString] retain];
    } else if([[request url] isEqual:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=CADEUR=X&f=l1"]]) {
        eurString = [[request responseString] retain];
    } else if([[request url] isEqual:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=CADEUR=X&f=d1"]]) {
        dateString = [[request responseString] retain];
    } else if([[request url] isEqual:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=CADEUR=X&f=t1"]]) {
        timeString = [[request responseString] retain];

}
}

- (void)parseLoadedData:(ASIHTTPRequest *)request {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *Date = [dateString stringByReplacingOccurrencesOfString:@"\"" withString:@""];
    NSString *Time = [timeString stringByReplacingOccurrencesOfString:@"\"" withString:@""];
    NSString *total = [NSString stringWithFormat:@"%@ %@",Date,Time];

    if ([eurString length] == 0) {
        test.text = [defaults objectForKey:@"date"];
        eur.text = [defaults objectForKey:@"eur"];
        usd.text = [defaults objectForKey:@"usd"];

    } else {
        test.text = total;
        eur.text = eurString;
        usd.text = usdString;
        [defaults setObject:test.text forKey:@"date"];
        [defaults setObject:usd.text forKey:@"usd"];
        [defaults setObject:eur.text forKey:@"eur"];
    }

    [defaults synchronize];
    [eurString release];
    [usdString release];
    [dateString release];
    [timeString release];
    [act stopAnimating];

}

1 Ответ

1 голос
/ 26 июля 2011

Хорошо, поскольку никто не ответил, я посмотрел больше на него и обнаружил, что, когда запрос завершен, мне нужно было установить текст для каждой загруженной строки как @ "", чтобы при выполнении следующего запроса и при отсутствии подключения к Интернету строка остается @ "", так что в pareLoadData приложение распознало [eurString length] == 0. В общем, мне просто нужно было добавить

    eurString = nil;
    usdString = nil;
    gbpString = nil;
    jpyString = nil;
    audString = nil;

после

    [eurString release];
    [usdString release];
    [dateString release];
    [timeString release];

Надеюсь, это поможет, если у кого-то еще есть подобная проблема. Я очень счастлив сейчас, теперь мое приложение супер стабильно и вообще не может вылетать! :)

...