To działa, ale jest nieco anty-wzorem. To, co mógłbym zrobić, to zgłoszenie błędu, jeśli wątek, do którego wywołana jest metoda, nie jest głównym wątkiem. Obowiązkiem osoby dzwoniącej jest upewnienie się, że metody są wywoływane na właściwych wątkach, tego rodzaju hacki tylko zachęcają do brzydkiego kodu. Poza tym, jeśli polegasz na tym, nagle podwajasz wysyłkę wiadomości nad każdym razem, gdy wywołujesz tę metodę.
Jeśli naprawdę nie mogę zmienić zachowanie rozmówcy, można spróbować wykonać następujące czynności:
-(void)methodToBeRunOnMainThreadWithObj:(id)object {
dispatch_sync(dispatch_get_main_queue(), ^{
// code goes here
});
}
spowoduje to cały kod wewnątrz bloku wysyłkowy być wykonywane w głównym wątku, a metoda nie wróci, dopóki jest kompletny. Jeśli chcesz, aby metoda natychmiast powróciła, możesz zamiast tego użyć dispatch_async
. Jeśli używasz dispatch_sync
, możesz użyć tej sztuczki nawet w przypadku metod, które mają nieważne typy zwrotu.
Ten kod ma także dodatkową zaletę, że obsługuje metody z argumentami niezwiązanymi z obiektami (int
itd.). Obsługuje również metody z dowolną liczbą argumentów, podczas gdy performSelector:withObject:
i jego metody rodzeństwa obsługują tylko ograniczoną liczbę argumentów. Alternatywą jest ustawienie obiektów NSInvocation
i to jest problem.
Pamiętaj, że wymaga to Grand Central Dispatch (GCD) na twojej platformie.
Co za piękna sztuczka! – Gerstmann