0

我的应用程序中出现 _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 无关,所以我假设它发生在我程序的其他地方。

我可以使用它的内存地址来确定它是哪个对象吗?或者它正在尝试从哪个线程?

4

2 回答 2

3

我猜它tabDictionary包含 UIViewController 的实例,并且您对 NSLog 的调用会导致访问视图控制器的属性以生成被记录的字符串。那是您在辅助线程上的 UIKit 访问。

observeValueForKeyPath:被调用时,您无法保证您在哪个线程上。如果它很重要,你应该检查你是否在主线程上,如果不是,使用performSelector:onMainThread:ordispatch_async来确保你在。

于 2012-04-23T20:54:09.427 回答
0

我知道这个错误是当我尝试在辅助线程上更新 UI 时。

UI 更新不是线程安全的。每当您需要更新 UI 时,您都需要回调主线程以进行更改。如果您的方法有 0 或 1 个参数GCD,则有几个选项。[[NSThread mainThread] performSelector:onThread:withObject:waitUntilDone:];

于 2012-04-23T20:53:46.850 回答