正是因为您的获取请求正在您的应用程序阻塞的主线程上运行。请记住,主线程是一个串行队列,并且在您的获取请求完成之前不会运行其他块(或事件)(即使理论上它可以,因为您的块处于等待状态)。这就解释了为什么当你中断时你总是会遇到 _psanch_mutexwait。
您应该在另一个队列上运行您的获取请求,并在必要时使用主队列上的结果。实现此目的的一种方法是使用以下模式:
- (void) fetchRequest1
{
dispatch_async(not_the_main_queue, ^(void) {
// Code the request here.
// Then use the result on the main if necessary.
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Use the result on the main queue.
});
});
}
另请注意,通常不需要在主队列上运行任何内容。事实上,如果您在该线程上运行得越少,您的应用程序通常会运行得更顺畅。当然,有些事情必须在那里完成,在这种情况下,您可以使用以下模式来确保它是:
- (void) runBlockOnMainThread:(void(^)(void))block
{
dispatch_queue_t thisQ = dispatch_get_current_queue();
dispatch_queue_t mainQ = dispatch_get_main_queue();
if (thisQ != mainQ)
dispatch_sync(mainQ, block);
else
block();
}