关于如何最好地取消其他线程上的阻塞作业,这可能是一个更通用的问题,但我对 Grand Central Dispatch 上下文中的解决方案感兴趣。我需要调用一个基本上阻塞的函数,直到它从网络获取数据;它可能会被永远阻止。我现在已经设置好了,这个被阻塞的调用发生在一个私有调度队列上,当我得到数据时,我把一个块放回主队列。问题是,一旦我调度了我的私有队列块和阻塞调用,我永远无法真正取消它。想象一下,这种能力与用户设置切换相关联。如果他们关闭,我希望这个阻塞作业和执行块基本上刚刚结束。这类问题有好的解决方案吗?
谢谢
- (void)_beginListeningForNetworkJunk
{
dispatch_async(my_private_queue, ^{
// blocks until it gets data
id data = [NetworkListener waitForData];
dispatch_async(dispatch_get_main_queue(), ^{
[self _handleNetworkData:data];
});
});
}
- (void)_endListeningForNetworkJunk
{
// How do I kill that job that is blocked on my private queue?
}