2015-04-29 24 views
1

由於主線程中的semaphore_wait_trap導致UI凍結/阻塞。如何在凍結的UI中查找衝突的線程

當UI被凍結,我暫停使用Xcode和最後兩行中的堆棧跟蹤:

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

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

我如何才能找到什麼原因造成的塊?

任何其他建議找出是什麼導致塊?

它總是阻塞在同一行/代碼上。

+0

在調試導航器(CMD-6),你應該有線程的列表。那裏的另一個線程也應該等待一些Queue。如果情況並非如此,我無法想象一個案子。通常這兩個線程正在彼此等待(例如,通過dispatch_sync)。 – Kalle

+0

@卡勒...我想你是對的 – GJain

回答

0

在Debug導航器(cmd-6)中,應該有一個線程列表。那裏的另一個線程也應該等待一些Queue。如果情況並非如此,我無法想象一個案子。通常這兩個線程正在彼此等待(例如,通過dispatch_sync)。

例如,你可能有這樣的:

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

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

後者將等待前永遠完成,因爲前者持有到myQueue中,直到它完成致電-foo

(注:mySerialQueue必須與DISPATCH_QUEUE_SERIAL要做到這一點被創建。)