Czy istnieje sposób, aby sprawdzić, czy bieżący wątek jest głównym wątkiem w Objective-C?
Chcę zrobić coś takiego.
- (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
ziemniak rybny
źródło
źródło
Odpowiedzi:
Zapoznaj się z
NSThread
dokumentacją API .Istnieją metody, takie jak
- (BOOL)isMainThread
+ (BOOL)isMainThread
i
+ (NSThread *)mainThread
źródło
Jeśli chcesz, aby metoda była wykonywana w głównym wątku, możesz:
źródło
NSOperationQueue.mainQueue().addOperationWithBlock { //your work here }
dispatch_sync()
zamiastdispatch_async()
w przykładzie.W Swift3
źródło
Jeśli chcesz wiedzieć, czy jesteś w głównym wątku, możesz po prostu użyć debugera. Ustaw punkt przerwania w interesującej Cię linii, a kiedy Twój program do niego dotrze, wywołaj to:
(lldb) thread info
Spowoduje to wyświetlenie informacji o wątku, w którym się znajdujesz:
(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
Jeśli wartość
queue
tocom.apple.main-thread
, to jesteś w głównym wątku.źródło
Poniższy wzorzec zapewni wykonanie metody w głównym wątku:
źródło
_cmd
automatycznie użyje metody, w której Twój fragment zostanie wklejony do ʕ • ᴥ • ʔDwie drogi. Z odpowiedzi @ rano,
Również,
źródło
Zwróć uwagę, że sprawdzam kolejkę operacji, a nie wątek, ponieważ jest to bezpieczniejsze podejście
źródło
W przypadku Monotouch / Xamarin iOS sprawdzenie można przeprowadzić w następujący sposób:
źródło
Szybka wersja
źródło
sprawdź tę odpowiedź na https://stackoverflow.com/a/34685535/1530581
źródło
Detale
Rozwiązanie 1. Wykryj dowolną kolejkę
Pobierz aktualny DispatchQueue?
Rozwiązanie 2. Wykryj tylko główną kolejkę
Stosowanie
Próba
Wynik (log)
źródło
źródło
UPDATE: wydaje się, że nie jest to poprawne rozwiązanie, zgodnie z nagłówkiem queue.h, jak wspomniano @demosten
Pierwsza myśl, która przyszła mi do głowy, kiedy potrzebowałem tej funkcjonalności, to linia:
I spojrzał na przyjęte rozwiązanie:
moje rozwiązanie 2,5 razy szybciej.
PS I tak, sprawdziłem, działa na wszystkie wątki
źródło
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.