2010-01-04 4 views
3

Les événements publiés par NSNotificationCenter postNotificationName sont-ils traités avant la mise à jour des événements de l'interface utilisateur?Les notifications NSNotificationCenter ont-elles une priorité plus élevée que les événements de chargement de cellules UITableView?

J'ai besoin de savoir car sinon mon programme actuel va se bloquer dans certains cas rares.

Code du modèle:

- (void)searchFinishedWithResults:(Results *)results { 
    self.results = results; 
    // If some table cells are loaded NOW, before notication is processed, we might crash! 
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:SearchResultArrived object:nil];  
} 

Lors du traitement du Notifications par, je vais courir UITableView reloadData. Toutefois, examinez si, avant de traiter la notification, l'interface utilisateur doit être mise à jour. Dans ce cas -tableView: cellForRowAtIndexPath: indexPath sera appelé, mais l'objet de résultats a changé, il récupérera les anciennes données.

Répondre

5

Les notifications sont envoyées exactement lorsque vous appelez postNotification: ou postNotificationName: object :, de manière synchrone, un observateur après l'autre (sans ordre particulier). Dans le cas que vous montrez, ils seront envoyés exactement après que vous ayez assigné la variable "résultats" et avant que la méthode ne se termine.

1

Directement à partir Apple's documentation on NSNotificationCenter:

Un centre de notification délivre notifications aux observateurs synchroniquement. En d'autres termes, le postNotification: méthodes ne retour jusqu'à ce que tous les observateurs ont reçu et traité la notification .

Pour envoyer des notifications de manière asynchrone utilisez NSNotificationQueue.

0

En passant, je pense que vous devez repenser votre conception. Il semble que vous n'ayez pas une séparation suffisante entre la vue et le modèle.

Votre modèle de données doit savoir ce qui est ou n'est pas d'anciennes données et ne doit renvoyer que les données actuelles à tableViewController. Le modèle de données devrait avoir un contrôle complet sur l'intégrité des données et il ne devrait pas être possible de le forcer à retourner les données erronées. Il devrait certainement être impossible que l'application va planter en raison d'un tel forçage.

+0

Je ne pense pas que ce soit le cas ici. Si vous regardez le code ci-dessus, c'est un exemple parfait de NSNotificationCenter - l'OP avertit simplement les observateurs que les résultats de recherche sont arrivés et basé sur cette notification, il pourrait exécuter des choses légitimes comme animer dans une vue Résultat de recherche, ou automatiquement ignorer un vue "chargement modal" etc. Le code ne montre pas la mauvaise pratique de résultats ne pas être gérés correctement autrement. – strange

Questions connexes