Existe-t-il un moyen de vérifier si le thread actuel est le thread principal d'Objective-C?
Je veux faire quelque chose comme ça.
- (void)someMethod
{
if (IS_THIS_MAIN_THREAD?) {
NSLog(@"ok. this is main thread.");
} else {
NSLog(@"don't call this method from other thread!");
}
}
objective-c
iphone
multithreading
cocoa
xamarin.ios
pomme de terre poisson
la source
la source
Réponses:
Jetez un œil à la
NSThread
documentation de l' API .Il existe des méthodes comme
- (BOOL)isMainThread
+ (BOOL)isMainThread
et
+ (NSThread *)mainThread
la source
Si vous souhaitez qu'une méthode soit exécutée sur le thread principal, vous pouvez:
la source
NSOperationQueue.mainQueue().addOperationWithBlock { //your work here }
dispatch_sync()
place dedispatch_async()
dans votre exemple.Dans Swift3
la source
Si vous voulez savoir si vous êtes ou non sur le thread principal, vous pouvez simplement utiliser le débogueur. Définissez un point d'arrêt sur la ligne qui vous intéresse, et lorsque votre programme l'atteint, appelez ceci:
(lldb) thread info
Cela affichera des informations sur le fil sur lequel vous êtes:
(lldb) thread info thread #1: tid = 0xe8ad0, 0x00000001083515a0 MyApp`MyApp.ViewController.sliderMoved (sender=0x00007fd221486340, self=0x00007fd22161c1a0)(ObjectiveC.UISlider) -> () + 112 at ViewController.swift:20, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
Si la valeur de
queue
estcom.apple.main-thread
, vous êtes sur le thread principal.la source
Le modèle suivant assurera qu'une méthode est exécutée sur le thread principal:
la source
_cmd
utilisera automatiquement la méthode dans laquelle votre extrait est collé dans ʕ • ᴥ • ʔDeux manières. D'après la réponse de @ rano,
Aussi,
la source
notez que je vérifie la file d'attente des opérations, pas le fil, car c'est une approche plus sûre
la source
Pour Monotouch / Xamarin iOS, vous pouvez effectuer la vérification de cette manière:
la source
Version Swift
la source
vérifiez cette réponse sur https://stackoverflow.com/a/34685535/1530581
la source
Détails
Solution 1. Détectez toute file d'attente
Obtenir DispatchQueue actuel?
Solution 2. Détecter uniquement la file d'attente principale
Usage
Échantillon
Résultat (journal)
la source
la source
MISE À JOUR: semble que ce ne soit pas la solution correcte, selon l'en-tête queue.h comme mentionné @demosten
La première pensée m'a été apportée, lorsque j'ai eu besoin de cette fonctionnalité, c'était la ligne:
Et avait cherché la solution acceptée:
mine solution 2,5 fois plus rapide.
PS Et oui, j'avais vérifié, ça marche pour tous les threads
la source
When dispatch_get_current_queue() is called on the main thread, it may or may not return the same value as dispatch_get_main_queue(). Comparing the two is not a valid way to test whether code is executing on the main thread.