2011-08-03 7 views

답변

3

실행중인 현재 블록을 중지 할 수 있는지 확실하지 않지만 dispatch_suspend를 호출하여 큐가 새 큐 항목을 실행하지 못하도록 할 수는 있습니다. 그런 다음 dispatch_resume을 호출하여 실행을 다시 시작할 수 있습니다 (그러나 원하는대로 실행되지는 않습니다).

http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

2

는 NSOperationQueue에 cancelAllOperations 참조하십시오. 작업이 취소 메시지를 올바르게 처리하도록하는 것은 귀하에게 달려 있습니다.

12

이 꽤 자주있는 질문이며, 하나를하기 전에 나는 대답했습니다

Suspending GCD query problem

짧은 대답은 GCD가 취소 API가없는 것입니다; 너 자신의 취소 코드를 구현해야한다. 위의 대답에서 기본적으로 어떻게 수행 할 수 있는지 보여줍니다.

0

또 다른 해결책은 이전 대기열을 버리고 새로운 대기열을 만드는 것입니다. 그것은 나를 위해 작동합니다. 배열을 지우는 것과 같거나, 배열의 모든 요소를 ​​지울 수도 있고 아니면 기존 배열을 대체 할 배열을 새로 만들 수도 있습니다.

+0

하지만 당신은 어떻게해야합니까? – Fattie

+1

나는이 일을 어떻게하는지 모르지만 그것이 효과가 있다고 생각하지 않는다. 큐를 해제해야하지만 큐의 각 블록은 큐에 대한 참조를 유지하므로 모든 블록이 완료 될 때까지 메모리에서 실제로 지워지지는 않습니다. tl; dr 이렇게하면 방대한 메모리 누수가 발생합니다. – phreakhead

10

iOS 9/OS X 10.11에서 직접적인 논리를 구현하지 않고도 대기열에있는 작업을 디스패치 대기열에서 비울 수는 없습니다.

디스패치 대기열을 취소해야하는 경우 NSOperationQueue을 사용하는 것이 더 나을 것입니다. 예를 들어, 다음은 큐를 "취소"방법은 다음과 같습니다

NSOperationQueue* queue = [NSOperationQueue new]; 
queue.maxConcurrentOperationCount = 1; // make it a serial queue 

... 
[queue addOperationWithBlock:...]; // add operations to it 
... 

// Cleanup logic. At this point _do not_ add more operations to the queue 
queue.suspended = YES; // halts execution of the queue 
[queue cancelAllOperations]; // notify all pending operations to terminate 
queue.suspended = NO; // let it go. 
queue=nil; // discard object 
9

당신이 SwiftDispatchWorkItem 클래스를 사용하는 경우이 작업 단위를 개별적으로 취소 할 수 있습니다.

작업 항목을 사용하면 개별 작업 단위 (UOW)의 특성을 직접 구성 할 수 있습니다. 또한 개별 작업 단위를 완료 할 때까지 기다리거나 완료에 대한 알림을 받고 취소 할 때 사용할 수 있습니다. (iOS 8.0+ macOS 10.10 이상에서 사용 가능).

DispatchWorkItem은 수행 할 수있는 작업을 캡슐화합니다. 작업 항목 은 DispatchQueue 및 DispatchGroup 내에 디스패치 할 수 있습니다. A DispatchWorkItem은 DispatchSource 이벤트, 등록 또는 취소 처리기로 설정할 수도 있습니다.

https://developer.apple.com/reference/dispatch/dispatchworkitem

+1

좋은 아이디어를 사용하여 화살표 :) – Vyacheslav

관련 문제