다른 스레드에서 차단 작업을 가장 잘 취소하는 방법은 훨씬 일반적인 질문 일 수 있지만 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는 내 것이 아닙니다. 그 프레임 워크. –
공개적으로 액세스 할 수있는 프레임 워크입니까 (예 : 오픈 소스)? –