Вопрос по xcode, ios, objective-c – вызвать функцию, используя поток в xcode

5

я создал поток в xcode, и я дал имя функции для вызова из этого потока.   но моя проблема в том, что имя функции, которая дается для вызова, не вызывается (узнал, когда ставил точку останова в этой функции)

код:

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

и позже я попробовал это также:

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

выше func1 - имя вызываемой функции.

так может кто-нибудь, пожалуйста, скажите мне, как создать поток и вызвать оттуда func1 ....

Ваш Ответ

3   ответа
0

аботать со вторым подходом, который вы использовали. Может быть, у вашего fuc1 нет формального аргумента, и все же вы вызываете селектор, подобный этому @selector (fuc1 :), и передаете объект как ноль. так может быть по этой причине он не работает. Это может быть одной из причин. просто попробуйте, если нет.

Всякий раз, когда вы используете какой-либо объект любого класса, никогда не забывайте выделять память, как вы делали это при первом подходе.
16

что вы на самом деле создаете новый поток. Вы создаете пустойmyThread переменная, а затем вызватьstart на нем, но это просто приведет кstart отправляетсяnil, Пустая переменная потока затем отправляетсяperformSelector:onThread:withObject:waitUntilDone: метод, который, вероятно, ничего не будет делать.

Вам нужно будет правильно создать поток, прежде чем вы сможете что-то запустить на нем, используяperformSelector:onThread:withObject:waitUntilDone:.

В качестве альтернативы было бы гораздо проще, если бы вы не заботились о том, на каком фоновом потоке работает этот метод, просто использоватьperformSelectorInBackground:withObject:, Например:

[self performSelectorInBackground:@selector(func1:) withObject:nil];
извините, действие не происходило в главном потоке, так как после func1 '& apos;:' apos; там, он не работал, и я подумал, что он принимает основной поток. Но теперь, когда я удалил ":" (согласно другому ответу на этот вопрос), он работает нормально ... спасибо за ответ ..... , Subrat nayak.
спасибо за ответ, но иногда требуется основная ветка, которую я не хочу ..... Subrat nayak.
Насколько я понимаю, executeSelectorInBackground: создает поток с низким приоритетом. По крайней мере, NSThread или detachNewThreadSelector: выполняется быстрее.
Мне было бы интересно узнать любую имеющуюся у вас информацию оperformSelectorInBackground:withObject: используя основной поток. Документация Apple гласит: «Этот метод создает новый поток в вашем приложении, переводя ваше приложение в многопоточный режим, если оно еще не было». Если у вас есть информация, показывающая, что иногда она использует основной поток, мне было бы интересно ее увидеть.
3

[NSThread detachNewThreadSelector:@selector(func1) toTarget:self withObject:nil];

Поскольку вы не передаете никакой объект своему & quot; func1 & quot; (иначе: у вашего метода нет параметров) вам не нужно указывать & quot;: & quot; после его имени.

Похожие вопросы