직렬 대기열이있는 경우 어떻게 주 스레드에서 즉시 실행을 중지하고 모든 작업을 취소 할 수 있습니까?디스패치 대기열에서 작업 실행을 중지하는 방법은 무엇입니까?
답변
실행중인 현재 블록을 중지 할 수 있는지 확실하지 않지만 dispatch_suspend를 호출하여 큐가 새 큐 항목을 실행하지 못하도록 할 수는 있습니다. 그런 다음 dispatch_resume을 호출하여 실행을 다시 시작할 수 있습니다 (그러나 원하는대로 실행되지는 않습니다).
는 NSOperationQueue에 cancelAllOperations 참조하십시오. 작업이 취소 메시지를 올바르게 처리하도록하는 것은 귀하에게 달려 있습니다.
이 꽤 자주있는 질문이며, 하나를하기 전에 나는 대답했습니다
짧은 대답은 GCD가 취소 API가없는 것입니다; 너 자신의 취소 코드를 구현해야한다. 위의 대답에서 기본적으로 어떻게 수행 할 수 있는지 보여줍니다.
또 다른 해결책은 이전 대기열을 버리고 새로운 대기열을 만드는 것입니다. 그것은 나를 위해 작동합니다. 배열을 지우는 것과 같거나, 배열의 모든 요소를 지울 수도 있고 아니면 기존 배열을 대체 할 배열을 새로 만들 수도 있습니다.
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
당신이 Swift
DispatchWorkItem
클래스를 사용하는 경우이 작업 단위를 개별적으로 취소 할 수 있습니다.
작업 항목을 사용하면 개별 작업 단위 (UOW)의 특성을 직접 구성 할 수 있습니다. 또한 개별 작업 단위를 완료 할 때까지 기다리거나 완료에 대한 알림을 받고 취소 할 때 사용할 수 있습니다. (iOS 8.0+ macOS 10.10 이상에서 사용 가능).
DispatchWorkItem은 수행 할 수있는 작업을 캡슐화합니다. 작업 항목 은 DispatchQueue 및 DispatchGroup 내에 디스패치 할 수 있습니다. A DispatchWorkItem은 DispatchSource 이벤트, 등록 또는 취소 처리기로 설정할 수도 있습니다.
↳ https://developer.apple.com/reference/dispatch/dispatchworkitem
좋은 아이디어를 사용하여 화살표 :) – Vyacheslav
- 1. java에서 Executor ThreadPool의 실행을 중지하는 방법은 무엇입니까?
- 2. delayed_job. 대기열에서 작업 삭제
- 3. NSInvocationOperation을 중지하는 방법은 무엇입니까?
- 4. JDialog가 열려있는 동안 실행을 일시 중지하는 방법
- 5. Java에서 일정 시간이 지나면 실행을 중지하는 방법은 무엇입니까?
- 6. 특정 시간에 .sh 스크립트의 실행을 중지하는 방법은 무엇입니까?
- 7. PHP 함수 실행을 중지하는 방법?
- 8. 응용 프로그램 실행을 중지하는 방법
- 9. App Engine의 작업 대기열에서 TombstonedTaskError 란 무엇입니까?
- 10. Hudson에게 작업 대기열에서 중복을 무시하도록 지시하는 방법은 무엇입니까?
- 11. sinatra 실행을 멈추는 방법은 무엇입니까?
- 12. resque로 대기열에서 작업을 제거하는 방법은 무엇입니까?
- 13. 현재 메서드 호출의 실행을 중지하는 방법
- 14. IDLE에서 Python 프로그램 실행을 중지하는 방법
- 15. 애니메이션을 중지하는 방법은 무엇입니까?
- 16. IntentService를 중지하는 방법은 무엇입니까?
- 17. Resque 대기열에서 작업을 임의로 셔플하는 방법은 무엇입니까?
- 18. SQL Server를 사용하여 저장 프로 시저 실행을 중지하는 방법?
- 19. Perl에서 디스패치 테이블을 구현하는 방법은 무엇입니까?
- 20. 실행중인 PHP 스크립트를 요청하거나 중지하는 동안 컬을 중지하는 방법은 무엇입니까?
- 21. Linux에서 'uninterruptible'프로세스를 중지하는 방법은 무엇입니까?
- 22. UILabel 스크롤을 중지하는 방법은 무엇입니까?
- 23. UIWebView에서 NetworkActivity를 중지하는 방법은 무엇입니까?
- 24. NStimer 이벤트를 중지하는 방법은 무엇입니까?
- 25. 자바 애플리케이션을 중지하는 방법은 무엇입니까?
- 26. 알림을받을 때까지 NSThread를 일시 중지하는 방법은 무엇입니까?
- 27. Android에서 Wifi 및 Bluetooth 어댑터를 사용하는 동안 코드 실행을 중지하는 방법은 무엇입니까?
- 28. PROCESS_OUTGOING_CALLS 통화를 중지하는 방법은 무엇입니까? android
- 29. 코드 실행을 지연시키는 가장 좋은 방법은 무엇입니까?
- 30. 디스패치 장식
하지만 당신은 어떻게해야합니까? – Fattie
나는이 일을 어떻게하는지 모르지만 그것이 효과가 있다고 생각하지 않는다. 큐를 해제해야하지만 큐의 각 블록은 큐에 대한 참조를 유지하므로 모든 블록이 완료 될 때까지 메모리에서 실제로 지워지지는 않습니다. tl; dr 이렇게하면 방대한 메모리 누수가 발생합니다. – phreakhead