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];
});
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é.
C'est - vous entrez dans le fil principal et publiez votre notification. Je ne peux pas être plus sûr que ça.
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])
}
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.