iOS programming in 2010

Jak odczytać NSArray z URLa bez blokowania aplikacji

Posted: September 14th, 2010 | Author: | Filed under: Xcode solutions | Comments Off on Jak odczytać NSArray z URLa bez blokowania aplikacji

Tworząc aplikację wyświetlającą dane z sieci bardzo często stajemy przed problemem: jak odczytać dane z pliku zewnętrznego.
Parsowanie XML w Objective-C jest bardzo pracochłonne, więc lepiej przeanalizować, czy łatwiejszym rozwiązaniem nie jest utworzyć .plist file (Property list) na serwerze i taki format pliku pobierać do aplikacji.

Warto zauważyć, że czytanie NSArray lub NSDictionary z pliku to tylko 2 linijki:

NSURL *myUrl=[NSURL URLWithString:@"https://iphone.orpi.pl/someexamplefile.plist"];
NSArray *myChartData=[NSArray arrayWithContentsOfURL:myUrl];

Pojawia się jednak problem, jeśli urządzenie na którym próbujemy odczytać plik nie ma podłączenia do internetu.
W taki przypadku myChartData zwróci nil, ale do czasu otrzymania timeout urzÄ…dzenie bÄ™dzie “wisiaÅ‚o”.

Rozwiązaniem jest wyświetlenie loadera (o tym w kolejnym artykule) oraz wykorzystanie obiektu NSURLConnection

NSURL *myUrl=[NSURL URLWithString:stringUrl];
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:myUrl];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * receivedData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

po tej operacji otrzymujemy obiekt receivedData a w przypadku niepowodzenia obiekt error

Teraz tylko część “najtrudniejsza” – wczytanie NSData do NSArray
Jest kilka metod – zademonstrujÄ™ jednÄ… z nich

if (error==nil)
{
NSString *listFile = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding];
NSArray *myChartData=[listFile propertyList];
}
else
{
// obsługa błędu, np alert:
NSString *alertString=@"No internet connection or server not found." ;
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:alertString
message:nil
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil];
[alert show];
[alertString release];
};

Przedstawiona metoda ma pewną wadę. Jeśli odczytamy nieprawidłowe dane, aplikacja może otrzymać pusty obiekt.
Wkrótce opiszę kolejną metodę pozwalającą na sprawdzenie, czy otrzymany obiekt jest typu NSArray;


Comments are closed.