2010-07-09 5 views
0

J'ai une application qui a 4 TableViewController qui font chacun une instance d'un RSSParser et ont une fonction appelée commonInit qui commence l'analyse. Initialement, j'ai appelé le commonInit de la fonction init par défaut dans le TableViewController et cela fonctionne bien mais en cas de pas d'accès à Internet, j'obtiendrais 4 fenêtres d'alerte qui est un peu mauvais mojo. Donc, je voulais plutôt faire une vérification d'accessibilité dans l'appdelegate, puis notifier chaque TableViewController et démarrer l'analyseur. La vérification d'accessibilité est lancée dans un thread séparé afin d'éviter le blocage si des problèmes DNS, etc.Problème de filetage iPhone

Mais lorsque j'exécute l'application, les analyseurs sont appelés correctement, mais ils ne reçoivent jamais de données. Dans mon analyseur j'ai suivi l'exemple de la pomme de NSURLConnection pour le téléchargement asynchrone des flux.

Donc, dans mon appdelegate je:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
.... 
// Reachability setup, a new thread is created to make it async to avoid possible stall. 
[NSThread detachNewThreadSelector:@selector(checkConnection) toTarget:self withObject: nil]; 
... 
return YES;} 

et après cela, je dois:

-(void)checkConnection{ 
//Test for Internet Connection 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

Reachability *r = [Reachability reachabilityWithHostName:@"www.somehostname.com"]; 
NetworkStatus internetStatus = [r currentReachabilityStatus]; 
if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)) { 
    UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Missing Internet" message:@"Can not connect to the internet at the moment." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [errorAlert show]; 
} else { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"activation" object:nil]; 
} 
[pool release];} 

et que vous pouvez voir que je fais la notification suivante s'il y a une connexion:

[[NSNotificationCenter defaultCenter] postNotificationName:@"activation" object:nil]; 

J'espère que vous pouvez m'aider.

Répondre

0

Je pense que vous devriez publier la notification sur le sujet principal.

C'est facile avec Grand Central Dispatch. C'est un peu plus difficile avec l'ancienne API.

Je propose la création d'une nouvelle méthode:

- (void)postNotification:(NSDictionary *)userInfo { 
    NSString *notificationName = [userInfo objectForKey:@"name"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil]; 
} 

Et puis remplacez la ligne où vous envoyez des messages avec la notification maintenant:

NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"activation" forKey:@"name"]; 
[self performSelectorOnMainThread:@selector(postNotification:) withObject:userInfo waitUntilDone:NO];