我正在使用 dispatch_sync 执行一个块并且该块被正确执行。但是这个块是在主线程上执行的。根据苹果文档:
串行队列(也称为私有调度队列)按添加到队列的顺序一次执行一项任务。当前正在执行的任务在由调度队列管理的不同线程上运行(可能因任务而异)。
这意味着(或我所理解的)正在执行的当前进程将在单独的线程上运行。
下面是我用来判断发生了什么的代码。它在 NSURLConnection 的didReceiveData:委托方法中被调用(我知道我不应该在 didReceiveData: 委托方法中这样做——但这只是一个关注 dispatch_sync 的示例)。以下是我可以假设的不同方式来证明我的结论:
在全局并发队列上使用 dispatch_sync
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if ([NSThread isMainThread]) { NSLog(@"Main Thread"); } else NSLog(@"Not on Main Thread"); //Some Process });
输出 -
Main Thread
Main Thread
Main Thread
// Main Thread printed till didReceiveData: gets called
在使用 dispatch_queue_create 的自创建队列上使用dispatch_sync
// Create queue somewhere else like this dispatch_queue_t newQueue = dispatch_queue_create("WriteQueue", DISPATCH_QUEUE_SERIAL); dispatch_sync(newQueue, ^{ if ([NSThread isMainThread]) { NSLog(@"Main Thread"); } else NSLog(@"Not on Main Thread"); //Some Process });
输出 -
Main Thread
Main Thread
Main Thread
// Main Thread printed till didReceiveData: gets called
我在这里有点惊讶,块总是在主线程上执行,或者我错过了什么。因为它似乎与我认为的 Apple Doc 背道而驰。有谁知道这是怎么一回事?
更新:根据其他讨论,我知道 dispatch_sync 在同一个线程上执行一个块(大多数时候),那么为什么苹果文档的语句在某些方面是矛盾的。为什么苹果会说“当前正在执行的任务在由调度队列管理的不同线程(可能因任务而异)上运行。” 还是我还缺少什么?