2011-01-03 8 views
1

Ich habe eine App, die UITabBar verwendet und es muss Inhalte aus dem Internet herunterladen, so entschied ich mich, die Klasse Erreichbarkeit zu verwenden. Wenn ich es starte, funktioniert die Methode sehr gut, aber wenn ich nicht darauf warte, dass der ganze Job erledigt ist und ich zu einem anderen tabBar Index gehe, dann gehe ich zurück zum ersten, die App hält an und bewegt sich nicht. Hier ist ein Code:Probleme mit der Erreichbarkeit Apple Klasse

- (void)viewWillAppear:(BOOL)animated { 
[[self.navigationController navigationBar] setHidden:YES]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; 
[internetReachable startNotifier]; 
[hostReachable startNotifier]; 
} 
- (void)checkNetworkStatus:(NSNotification *)notice { 
BOOL flag; 
UIAlertView *alert; 
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 

alert = [[UIAlertView alloc] initWithTitle:@"Attenzione!" message:@"Non ci sono connessioni disponibili a internet: impossibile scaricare i dati!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
switch (internetStatus) { 
    case NotReachable: 
     self.internetActive = NO; 
     flag = NO; 
     break; 
    case ReachableViaWiFi: 
     self.internetActive = YES; 
     flag = YES; 
     break; 
    case ReachableViaWWAN: 
     self.internetActive = YES; 
     flag = YES; 
     break; 
} 
if (flag) 
    [NSThread detachNewThreadSelector:@selector(loadDataFromInternet) toTarget:self withObject:nil]; 
else { 
    [alert show]; 
    [self.spinner stopAnimating]; 
} 

[alert release]; 
} 

Ich werde alles einfügen, was Sie sonst noch brauchen.

+0

verwenden Sie die neueste Erreichbarkeitsklasse von Apple, die für iOS 4.2 aktualisiert wurde? – iPhoneDev

+0

Ja. Für v4.0, aktualisiert am 20-07-2010 – IssamTP

Antwort

4

Ich hatte ein ähnliches Problem mit einer App. Dies ist auch ähnlich zu this question, die ich gerade beantwortet habe - stellen Sie sicher, dass Sie asynchron überprüfen, nicht auf den Haupt-Thread (oder zumindest nicht die Benutzeroberfläche zu blockieren).

Auch interessanterweise habe ich eine Ressource gelesen, die darauf hindeutet, dass, wenn Sie den Internetzugang benötigen, nur dafür gehen. Verwenden Sie die Erreichbarkeit nicht zuerst für "Preflight". Verwenden Sie die Erreichbarkeit, nachdem Sie nicht feststellen konnten, warum Sie fehlgeschlagen sind :). Ich erinnere mich, dass dieses Stück Weisheit von Apple selbst stammt - aber ich vergesse, wo ich es gelesen habe und ein schneller Google findet es nicht.

+0

Vielen Dank. Das ist interessant. Ich habe dieses Problem teilweise gelöst, indem ich die Erreichbarkeit nur in der ersten Ansicht verwendet habe, um zu prüfen, ob der Benutzer die Verbindung hat (die gesamte App basiert auf Daten, die aus dem Internet heruntergeladen wurden). Mit NSURLConnection kann ich dann prüfen, ob ein Blockierfehler vorliegt und Abstürze verhindern. – IssamTP

+0

Das sind einige Worte der Weisheit. Ich hatte Probleme mit der Erreichbarkeitsüberprüfung, und ich bekam die längsten Zeit die falschen Ergebnisse. Es ist sinnvoll, den Erreichbarkeitsstatus erst nach dem Ausfall einer netzwerkbezogenen Anfrage zu prüfen. – wasabi