如何在冻结的UI中查找冲突的线程

时间:2015-04-29 08:47:26

标签: ios

由于主线程中的semaphore_wait_trap,我正在冻结/阻止UI。

当UI被冻结时,我暂停使用XCODE和stacktrace中的最后两行:

0x103f0ea30 <+809>:  callq  0x103f1554d               ; _dispatch_thread_semaphore_wait

dispatch_sync(someQueue, block);  // this is my code.

如何找到导致阻塞的原因?

还有其他建议可以找出造成阻塞的原因吗?

它总是阻塞在相同的行/代码上。

1 个答案:

答案 0 :(得分:0)

在Debug导航器(cmd-6)中,您应该有一个线程列表。其中一个OTHER线程也应该等待someQueue。对于不是这种情况的情况,我无法想到。通常两个线程正在等待彼此(例如,通过dispatch_sync)。

例如,你可能有这个:

dispatch_sync(mySerialQueue, ^{
    [self foo];
});

- (void)foo
{
    dispatch_sync(mySerialQueue, ^{
        ...
    });
}

后者将等待前者永远完成,因为前者持有myQueue,直到完成对-foo的调用。

(请注意,必须使用mySerialQueue创建DISPATCH_QUEUE_SERIAL才能实现此目的。)