Это может быть гораздо более общий вопрос, связанный с тем, как лучше всего отменить блокировку заданий на других потоках, но меня интересует решение в контексте 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?
}
Darn. API, который я использую, не мой. Его структура. –
Является ли это общедоступной структурой (например, с открытым исходным кодом)? –