由于主线程中的semaphore_wait_trap,我正在冻结/阻止UI。
当UI被冻结时,我暂停使用XCODE和stacktrace中的最后两行:
0x103f0ea30 <+809>: callq 0x103f1554d ; _dispatch_thread_semaphore_wait
dispatch_sync(someQueue, block); // this is my code.
如何找到导致阻塞的原因?
还有其他建议可以找出造成阻塞的原因吗?
它总是阻塞在相同的行/代码上。
答案 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
才能实现此目的。)