2010-07-08 2 views
2

В моем приложении iPhone мне нужно подключиться к веб-серверу, так как это может занять некоторое время, я использую темы, как это:Внимание: UIKit не должен вызываться из вторичных потоков

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

- (void)sendStuff { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    //Need to get the string from the textField to send to server 
    NSString *myString = self.textField.text; 

    //Do some stuff here, connect to web server etc.. 

    [pool release]; 
} 

В строке где я использую self.textField Я получаю предупреждение в консоли, говоря: void _WebThreadLockFromAnyThread (bool), 0x5d306b0: получение веб-блокировки из потока, отличного от основного потока или веб-потока. UIKit не следует вызывать из вторичного потока.

Как я могу использовать textField без получения этой ошибки?

+0

Чтобы помочь вам нужно знать, почему вы отключаете поток (что так долго нужно делать), какая информация UI вам нужна и какая информация пользовательского интерфейса вы хотите обновить. – tonklon

+0

Привет! Я обновил вопрос. Мне нужно подключиться к веб-серверу, и мне нужно использовать текст из текстового поля для отправки на сервер. – Martin

+0

Вы должны принять ответ Грэма Ли или тонклона. Вы должны вытащить текст поиска, прежде чем вы создадите поток и передадите его в качестве аргумента в селектор. –

ответ

0

Это действительно опасное поведение. MainThread является единственным, который должен взаимодействовать с пользовательским интерфейсом. Верните ли ваш поток, например, строку в mainthread, и у вас есть способ обновления интерфейса. Например, вы можете сделать это, передав селектор другому методу потока, а затем другой поток вызовите селектор на mainthread.

11

Выполнение любых селекторов, которые обрабатывают обновления пользовательского интерфейса в основном потоке. Вы можете сделать это с помощью метода NSObject -performSelectorOnMainThread:withObject:waitUntilDone:

3

Почему нет:

[NSThread detachNewThreadSelector: @selector(sendStuff:) toTarget: self withObject: self.textField.text]; 

?

12

Это немного зависит от того, что вы хотите сделать с текстовым полем. Если чтение значения это единственное, что вы можете сделать:

[NSThread detachNewThreadSelector:@selector(sendStuff) toTarget:self withObject:self.textField.text]; 

- (void)sendStuff:(NSString*)myString { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    //Do someting with myString 
    [pool release]; 
} 

Если вы хотите изменить значение на TextField вы можете:

[self.textField performSelectorOnMainThread:@selector(setText:) withObject:@"new Text"]; 
+0

спасибо, что это потрясающее решение. – iDhaval

0
[self performSelectorOnMainThread:@selector(myMethod) withObject:nil waitUntilDone:NO]; 

будет работать

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