Сообщение об ошибке, что UIKit не должен вызываться из вторичного потока - PullRequest
1 голос
/ 12 января 2011

У меня есть приложение, которое использует UISearchBar для динамического поиска из внешнего API на основе ввода пользователя.

Приложение выполняет поиск во внешнем API и корректно отображает результаты, но когда я выбираю любую строку из результатов поиска, экран зависает, и я получаю эту ошибку;

Пробовалчтобы получить веб-блокировку из потока, отличного от основного потока или веб-потока, UIKit не следует вызывать из вторичного потока

Я абсолютно не представляю, как я могу это исправить.

Вот код;

- (void) run: (id) param  {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: [self URL]];
    [parser setDelegate: self];
    [parser parse];
    [parser release];
    [delegate parseDidComplete];
    [pool release];
} 

- (void) parseXMLFile: (NSURL *) url
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self setURL: url];
    NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                                 selector:@selector(run
   object: nil];
    [myThread start];
    [pool release];
}

Ответы [ 2 ]

10 голосов
/ 12 января 2011

"Пытался получить веб-блокировку от нить, отличная от основной нити или веб-ветка UIKit не должна быть вызывается из вторичного потока "

Исправление концептуально просто; не обновлять пользовательский интерфейс из вашей темы.

Если предположить, что parseDidComplete является источником сообщения, то что-то вроде этого будет "работать":

[delegate performSelectorOnMainThread: @selector(parseDidComplete) withObject: nil waitUntilDone: YES];

«Работа», потому что многопоточность трудна, и этот ответ полностью игнорирует любые проблемы с синхронизацией, которые у вас могут возникнуть.

Обратите внимание, что вам лучше использовать NSOperation и NSOperationQueue. Они хорошо документированы, и есть множество примеров.

1 голос
/ 12 января 2011

Я бы заподозрил строку:

[delegate parseDidComplete];

Если класс делегата взаимодействует с компонентами UIKit, то фоновый поток, который извлекает содержимое XML, затем вызывает внешние объекты, которые должны находиться в главном потоке.

Возможно, вы захотите использовать NSOperation и NSOperationQueue для выполнения асинхронных операций. Я считаю, что это обеспечивает более многопоточный способ обработки этого типа сценария использования.

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