我在我的应用中遇到_WebThreadLockFromAnyThread错误。它不会崩溃我的应用程序(像这样的每个其他错误已经崩溃了我的应用程序)。
我无法追踪违规代码行的位置。
我知道这个错误是当我尝试更新辅助线程上的UI时。我只使用1个线程,然后主要用于KVO'ing。我使用
进行所有方法调用[self foo]
错误是:
void _WebThreadLockFromAnyThread(bool), 0xb29ca60: Obtaining the web lock from a thread other than the main thread or the web thread. UIKit should not be called from a secondary thread.
错误在我的日志中出现在每次执行的同一位置,它在这两个日志条目之间打印:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"observeValueForKeyPath thread%@", [NSThread currentThread]);
if ([keyPath isEqualToString:MAXY])
{
NSLog(@"current tabDictionary:%@", self.tabDictionary);
但是应该与我的if stmt更改UI无关,所以我假设它在我的程序中的某个地方发生。
我可以使用它的内存地址来确定它是哪个对象吗?或尝试从哪个线程?
答案 0 :(得分:3)
我猜测tabDictionary
包含UIViewController的实例,并且您对NSLog的调用导致访问视图控制器的属性以生成记录的字符串。这是您在辅助线程上的UIKit访问。
当调用observeValueForKeyPath:
时,您无法保证您所处的线程。如果这很重要,您应该检查您是否在主线程上,如果不是,请使用performSelector:onMainThread:
或dispatch_async
来确保您是。
答案 1 :(得分:0)
我知道这个错误是当我尝试更新辅助设备上的UI时 线程。
UI更新不是线程安全的。每当您需要更新UI时,您需要回调主线程进行更改。如果您的方法有0或1个参数,则有两个选项GCD
和[[NSThread mainThread] performSelector:onThread:withObject:waitUntilDone:];
。