Pytanie w sprawie xcode, nsthread, objective-c, ios – wywołanie funkcji za pomocą wątku w xcode

5

stworzyłem wątek w xcode i podałem nazwę funkcji, która ma zostać wywołana z tego wątku. ale moim problemem jest to, że nazwa funkcji, która jest nadawana do wywołania, nie jest wywoływana (dowiedziałem się, kiedy umieścił punkt przerwania w tej funkcji)

kod:

<code> NSThread* myThread; 
 [myThread start]; 
 [self performSelector:@selector(func1:) onThread:myThread withObject:nil waitUntilDone:false]
</code>

a później próbowałem tego także:

<code>NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(func1:)object:nil];
[myThread start]; 
</code>

powyżej func1 to nazwa wywoływanej funkcji.

więc każdy może mi powiedzieć, jak utworzyć wątek i wywołać stamtąd func1 ....

Twoja odpowiedź

3   odpowiedź
16

W pierwszym przykładzie kodu nie wygląda na to, że tworzysz nowy wątek. Tworzysz pustymyThread zmienna, a następnie wywołaniestart na tym, ale spowoduje to tylkostart wysyłane donil. Pusta zmienna wątku jest następnie wysyłana doperformSelector:onThread:withObject:waitUntilDone: metoda, która prawdopodobnie nic nie zrobi.

Będziesz musiał poprawnie utworzyć wątek, zanim będziesz mógł rzeczywiście coś na nim uruchomićperformSelector:onThread:withObject:waitUntilDone:.

Alternatywnie byłoby o wiele łatwiej, zakładając, że nie obchodzi cię, który wątek tła działa w danej metodzie, aby po prostu użyćperformSelectorInBackground:withObject:. Na przykład:

<code>[self performSelectorInBackground:@selector(func1:) withObject:nil];
</code>
Chciałbym wiedzieć, jakie masz informacjeperformSelectorInBackground:withObject: używając głównego wątku. Dokumentacja Apple mówi: „Ta metoda tworzy nowy wątek w aplikacji, ustawiając aplikację w trybie wielowątkowym, jeśli jeszcze nie była”. Jeśli masz informacje, które pokazują, że czasami używa głównego wątku, chciałbym go zobaczyć. mttrb
Według mnie performSelectorInBackground: tworzy wątek o niskim priorytecie. Przynajmniej NSThread lub detachNewThreadSelector: wykonaj szybciej. mojuba
dzięki za odpowiedź, ale czasami zajmuje główny wątek, którego nie chcę ..... Subrat nayak.
przepraszam, że akcja nie odbywała się w głównym wątku, ponieważ po func1 jest „:”, nie działa i myślałem, że bierze główny wątek. Ale teraz, gdy usunąłem „:” (zgodnie z inną odpowiedzią to pytanie) działa dobrze .. dzięki za odpowiedź ...... Subrat nayak.
0

Jeśli twój func1 akceptuje jeden argument. To z pewnością musi działać z drugim podejściem, którego użyłeś. Być może twoja fuc1 nie ma formalnego argumentu i nadal wywołuje selektor jak ten @selector (fuc1 :) i przekazuje obiekt jako zero. może to być spowodowane tym, że nie działa. To może być jeden z powodów. po prostu spróbuj, jeśli nie.

Zawsze, gdy używasz dowolnego obiektu dowolnej klasy, nigdy nie zapomnij przydzielić pamięci, tak jak w pierwszym podejściu. iDevAmit
3

Spróbuj wykonać poniższe czynności, jeśli działa:

<code>[NSThread detachNewThreadSelector:@selector(func1) toTarget:self withObject:nil];
</code>

Ponieważ nie przekazujesz żadnego obiektu do swojego „func1” (aka: twoja metoda nie ma parametrów), nie musisz umieszczać „:” po nazwie.

Powiązane pytania