Показывать UIActivityIndicatorView при загрузке NSString из Интернета - PullRequest
0 голосов
/ 06 июля 2011

Привет, в моем приложении я загружаю NSString из Интернета, используя NSURL, а затем метка показывает текст. Если я нажму кнопку, чтобы загрузить строку, она будет выделена и останется выделенной в течение пары секунд. В течение этого времени я хочу, чтобы UIActivityIndicatorView появился, чтобы сообщить пользователю, что приложение действительно что-то делает. Я пытался просто добавить [activity startAnimating]; к IBAction, но он начинает анимацию только тогда, когда кнопка возвращается в состояние по умолчанию, а не когда она подсвечена. я тоже пробовал if ([button state] == UIControlStateHighlited) { [activity startAnimating]; } но это не работает


Круто, теперь работает! Большое спасибо! Вы забыли вставить [анимацию начала вращения] в код: D. Была ошибка, что если вы нажимали кнопку много раз подряд, приложение зависало, поэтому оно избавлялось от него:

- (IBAction)load:(id)sender { 
if ([act isAnimating]) {
}
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 голос
/ 06 июля 2011

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

Прежде всего, скачайте [библиотека ASIHTTPRequest] [1]. Это отличная библиотека для работы с сетевыми файлами. Я думаю, что вы должны использовать очередь для этого.

Затем поместите этот код в контроллер вида:

- (IBAction)buttonClicked:(id)sender {

    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];

}

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

    [yourSpinner stopAnimating];

}

В вашем заголовочном файле объявите эти объекты:

NSString *usdString;
NSString *eurString;
NSString *dateString;
NSString *timeString;

Я думаю, что это будет работать. ;)


РЕДАКТИРОВАТЬ: Я обновил код, так что он должен работать. Я проверял это сам. Мой способ загрузки ваших данных быстрее, безопаснее и эффективнее.

...