2010-12-01 4 views
0

J'ai cette méthode:NSNotification arrête la méthode de travail complètement

- (void)reloadMessages:(NSNotification *)notification { 
    NSLog(@"RECIEVED NEW MESSAGES TO MessagesRootViewController"); 

    // we need to get the threads from the database... 
    NSFetchRequest *theReq = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:managedObjectContext]; 
    [theReq setEntity:entity]; 

    threads = [[managedObjectContext executeFetchRequest:theReq error:nil] retain]; 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Message" message:@"New message" delegate:nil cancelButtonTitle:@"Thanks" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 

    [self.tableView reloadData]; 

} 

Si j'appelle [self reloadMessages:nil] alors la fonction fonctionne exactement comme prescrit ci-dessus.

Si elle est appelée à partir d'une notification NSNotificationCenter: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadMessages:) name:@"newMessagesArrived" object:nil]; il arrive à [alert show] et arrête avec l'écran estompé selon cette capture d'écran:

alt text

Toute idée pourquoi cela se passe?

Si je supprime le bit UIAlertView et laisse juste [self.tableView reloadData]; alors il appelle cette fonction, mais il s'arrête à un certain point. NSLogging sur les méthodes de source de données de vue table révèle que la vue de table est mise à jour avec le nombre de lignes correct (suggérant que la demande de données de base ne pose pas de problème) mais que cellForRowAtIndexPath n'est pas appelée.

Le programme ne plante pas. Sans la vue d'alerte, la vue de table ne recharge pas complètement comme ci-dessus, mais la vue est toujours utilisable et le déplacement de la vue de table provoque la mise à jour appropriée des lignes (comme dans l'onglet contacts et retour).

Si vous avez besoin de plus d'informations, alors je peux vous le donner.

Merci pour toute aide. :)

Tom

+0

La seule fois que j'ai vu cela se produire est quand je n'appelle pas '[show d'alerte]' du thread principal. Cela pourrait être la cause? – Luke

Répondre

1

Lorsque vous appelez la méthode de la NSNotificationCenter, la méthode n'est pas sur le fil de l'interface graphique. Vous devez exécuter le show AlertDialog et le rechargement TableView sur le thread GUI en utilisant performSelectorOnMainThread

+1

Si la notification de notification était sur le thread principal (thread graphique), la livraison est également sur le thread principal. Un 'performSelector: withObject: afterDelay:' est probablement l'arme de choix ici. – DarkDust

+0

aha! Je n'avais pas réalisé qu'il fonctionnait sur un nouveau fil! : p Merci pour ça! :) –

Questions connexes