Попытка получить веб-блокировку из потока, отличного от основного потока или веб-потока.Грохнуть сейчас - PullRequest
27 голосов
/ 13 марта 2012

bool _WebTryThreadLock(bool), 0x8053ce0: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...

Я получаю эту ошибку.

Сегодня я обнаружил эту ошибку впервые, отображается диалоговое окно с паролем, а в верхней части отображается представление оповещения, которое не должно появляться до viewWillAppear, когда отображается представление.Казалось, все это работало нормально, когда я разработал это на днях.Не уверены, почему блокировка потока была потеряна и как и как ее реализовать?

Ответы [ 6 ]

19 голосов
/ 13 марта 2012
This may be a result of calling to UIKit from a secondary thread. Crashing now...

... и насколько я понимаю, это именно то, что вы делаете.Вы вызываете [alertProgress dismissWithClickedButtonIndex:0 animated:YES];, метод UIKit, из потока, отличного от ваших основных потоков, что недопустимо.

Для очень прямого способа перезвонитьв основной поток, если вы не можете использовать GCD, взгляните на DDFoundation .

Ваш код в этом случае изменится только на;

[[alertProgress dd_invokeOnMainThread] dismissWithClickedButtonIndex:0 
                                       animated:YES]; 
15 голосов
/ 11 августа 2013

если вы собираетесь выполнить какую-либо операцию с пользовательским интерфейсом, это должно быть сделано в главном потоке ..

просто вставьте код в следующий синтаксис

dispatch_sync(dispatch_get_main_queue(), ^{

//Your code goes here

});

или вы можете вызвать свой метод, используя следующий синтаксис

[self performSelectorOnMainThread:@selector(yourmethod:)withObject:obj waitUntilDone:YES]

Надеюсь, это поможет

15 голосов
/ 18 апреля 2013

Я тоже столкнулся с этой проблемой, когда вызывал метод

[self performSelector:@selector(myMethod) withObject:nil afterDelay:.01];

Теперь это решено выполнением в основном потоке

[self performSelectorOnMainThread:@selector(myMethod) withObject:nil waitUntilDone:NO];
3 голосов
/ 04 июля 2014

// Самый простой способ - вызвать функцию, используя для этого основной поток.

dispatch_async(dispatch_get_main_queue(), ^{ [self doSomething]; });

2 голосов
/ 01 июня 2017

Дурай ответ в Свифте 3:

DispatchQueue.main.async {
  //Your code goes here
}
1 голос
/ 26 февраля 2013

У меня была похожая проблема, и я использовал

performSelectorOnMainThread:withObject:waitUntilDone:

, чтобы решить это. Надеюсь, это поможет.

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