2012-05-03 1 views
5

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

код:

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

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

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

выше func1 - это название функции, которую следует вызывать.

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

ответ

16

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

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

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

[self performSelectorInBackground:@selector(func1:) withObject:nil]; 
+0

благодарит за ответом, но иногда это занимает главный поток, который я не хочу ..... –

+0

Мне было бы интересно узнать любую информацию о 'performSelectorInBackground: withObject:' используя основную тему , В документации Apple говорится: «Этот метод создает новый поток в вашем приложении, помещая ваше приложение в многопоточный режим, если он еще не был». Если у вас есть информация, которая показывает, что иногда она использует основной поток, мне было бы интересно его увидеть. – mttrb

+0

Извините, что действие не было выполнено в основном потоке, так как после func1 здесь есть: :, он не работал, и я думал, что он принимает основной поток. Но теперь, когда я удалял ':' (согласно другому ответу для этого вопроса) он отлично работает .. спасибо за ответ ...... –

3

Попробуйте следующее, если он работает:

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

Поскольку вы не проходя какой-либо объект к вашему «func1» (иначе: ваш метод не имеет параметров) вам не нужно указывать «:» после его имени.

0

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

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^