Предупреждение: UIKit не должен вызываться из вторичного потока - PullRequest
2 голосов
/ 08 июля 2010

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

[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 без получения этой ошибки?

Ответы [ 5 ]

12 голосов
/ 08 июля 2010

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

[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"];
11 голосов
/ 08 июля 2010

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

3 голосов
/ 08 июля 2010

Почему бы и нет:

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

0 голосов
/ 18 февраля 2014
[self performSelectorOnMainThread:@selector(myMethod) withObject:nil waitUntilDone:NO]; 

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

0 голосов
/ 08 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...