web-dev-qa-db-fra.com

Publication de NSNotification sur le fil principal

J'ai trouvé l'extrait de code suivant qui permet à NSNotification d'être publié sur le fil principal à partir de n'importe quel fil d'arrière-plan. J'aimerais savoir s'il s'agit d'une pratique sûre et acceptable, s'il vous plaît?

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageRetrieved" 
                                                        object:nil 
                                                      userInfo:imageDict];
});
58
RunLoop

Oui, vous pouvez .

En général, vous voulez que les NSNotifications soient envoyées sur le principal, surtout si elles déclenchent des activités d'interface utilisateur comme fermer une boîte de dialogue de connexion modale.

Envoi de notifications à des threads particuliers

Les centres de notification réguliers délivrent des notifications sur le fil dans lequel la notification a été publiée. Les centres de notification distribués délivrent des notifications sur le thread principal. Parfois, vous pouvez exiger que les notifications soient délivrées sur un thread particulier déterminé par vous au lieu du centre de notification. Par exemple, si un objet s'exécutant dans un thread d'arrière-plan écoute les notifications de l'interface utilisateur, comme une fermeture de fenêtre, vous souhaitez recevoir les notifications dans le thread d'arrière-plan au lieu du thread principal. Dans ces cas, vous devez capturer les notifications lors de leur livraison sur le thread par défaut et les rediriger vers le thread approprié.

51
Anoop Vaidya

Oui

C'est - vous entrez dans le fil principal et publiez votre notification. Je ne peux pas être plus sûr que ça.

16
Undo

OUI

Swift 2 syntaxe

dispatch_async(dispatch_get_main_queue()) {
    NSNotificationCenter.defaultCenter().postNotificationName("updateSpinner", object: nil, userInfo: ["percent":15])
}

Swift syntaxe

DispatchQueue.main.async {
    NotificationCenter.default.post(name: "updateSpinner", object: nil, userInfo: ["percent":15])
}
14
WhipsterCZ

Quelque part le long de la ligne, cela est devenu possible avec:

addObserver(forName:object:queue:using:)

qui est ici , mais le point entier est l'objet queue.

La file d'attente des opérations à laquelle le bloc doit être ajouté. Si vous passez nil, le bloc est exécuté de manière synchrone sur le thread de publication.

Alors, comment obtenez-vous la file d'attente qui correspond à la boucle d'exécution principale?

let mainQueue = OperationQueue.main

Remarque: c'est lorsque vous vous abonnez aux notifications, vous le faites donc une fois et vous avez terminé. Le faire à chaque appel est terriblement redondant.

6
Dan Rosenstark