2017-03-28 3 views
0

나는 cancelAllOpeations을 호출 중이지만, 내가 묻는 경우 OpearationQueue.operationcount을 호출하면 해당 값이 제로가되지 않습니다.OperationQueue가 cancelAllOpeartions를 호출해도 작업 대기열에서 작업을 제거하지 않습니다.

취소 방법이 모두 작동하지만 opertioncount은 0이 아닙니다. 예상 했습니까?

+0

[작업 취소] (https://developer.apple.com/reference/foundation/operationqueue/1417849-cancelalloperations)는 큐에서 자동으로 제거하지 않거나 현재 실행중인 작업을 중지하지 않습니다. 다시 말해서, 작업이 즉시 시작되고 즉시 중단 될 때 작업이 취소됨을 인식해야합니다. –

+0

각 작업에 대한 취소를 처리 할 때 작업 대기열이 언제 작업 큐를 0으로 만들지 알고 싶습니다. 모든 작업이 취소 된 후입니까? – Santhosh

답변

0

NSOperationcancel 방법 (강조 광산)에 대한 Apple's API Document을 참조 : 작동 코드를 강제로하지 않습니다

이 방법은 중지. 대신 개체의 내부 플래그를 업데이트하여 상태 변경을 반영합니다. 작업이 이미 실행을 마친 경우이 메서드는 아무 효과가 없습니다. 현재 작업 대기열에 있지만 아직 실행 중이 지 않은 작업을 취소하면 대기열에서 작업을 제거 할 수 있습니다. 보다 빨리보다 빠릅니다. 이 큐에, 또는 큐에 있지 않으면 즉시 완료 표시하면

cancel 방법 "준비"와 같은 동작을 표시하거나한다. 작업이 대기열에 있기 때문에 취소 된 작업이 '빨리 시작됩니다. 하위 분류가 올바르게 수행 된 경우 취소 된 작업은 즉시 완료됨을 표시하고 최종 KVO 알림을 생성해야합니다. 그래야만 작업이 대기열에서 제외됩니다.

사용자 지정 작업 취소에 대한 자세한 내용은 Responding to the Cancel Command도 참조하십시오.

조작 대기열에 operations 배열 등록 정보에 0 작업이 남아있을 때를 알아야 할 경우 KVO를 사용하여 operationCount 키 경로의 관찰자로 대기열 소유자를 등록하는 것이 좋습니다. 그런 다음 해당 속성의 값이 변경되었다는 알림을 받으면 값이 0인지 확인한 다음 필요한 모든 논리를 수행 할 수 있습니다. NSOperations는 NSOperationQueue에서 실행되는 경우 일반적으로 백그라운드 스레드가 될 운영중인 스레드에서 KVO 알림을 보냅니다. 즉, UI/차단 논리를 수행해야하는 경우 다음을 수행해야합니다. 주 스레드에서 실행되는지 확인하십시오.

KVO를 사용하여 관찰자를 추가하려면 나중에 관찰자를 제거하여 균형을 유지해야합니다. 실제로 KVO를 활용하기로 결정한 경우 KVO programming guide을 모두 소화하고 KVO API docs을 통해 읽으 려한다면 해당 프레임 워크로 작업 할 때 정당한주의가 부족하면 정의되지 않은 동작, 메모리 누수 또는 심지어 불량 액세스가 발생할 수 있습니다. .

관련 문제