NSOperationQueue 자식 작업 잔뜩있는 대기열이있는 NSOperation이 있습니다.NSOperation. 취소 대 완료 상태
대기열에서 cancelAllOperations를 호출 한 후에도 내 기본 메소드가 waitUntilAllOperationsAreFinished에 걸려있는 문제가있었습니다.
그런 다음 취소시 isFinished에 사용하는 전체 플래그를 설정하면 더 이상 취소 된 큐에 백업되지 않습니다.
- (BOOL)isFinished
{
return complete;
}
- (void)cancel
{
cancelled = YES;
complete = YES;
[_childOperationQueue cancelAllOperations];
}
이것은 올바른 동작입니까? 취소 된 작업은 기술적으로 완료되어야합니까? NSOperation이 isFinished를 제거하기 전에 true로 설정해야하는 것처럼 보입니다. 생각해볼 때 '정리'가 가능할 수도 있지만 프로토콜이 여기에 있고 Google이 많이 알려지지 않았 음을 알 수 없습니다.
작업이 실제로 취소 되었습니까? 취소하도록 지정하면 즉시 취소되지 않고 블록을 알려주고 취소해야합니다. 실제로'self.cancelled'를 확인하고 작업을 중단해야합니다. 'isFinished' 또는'cancel'을 오버라이드해서는 안되며, 양쪽 모두의 기본 동작이 작동해야합니다. –
@AbhiBeckert 비 동시 작업을 작성하는 경우 올바른 것입니다. 그러나 동시 작업을 작성할 때 항상 isFinished 메소드를 무시합니다 (명시 적으로 또는 자동으로 합성 된 getter로). 또한'cancel'을 다시 쓰면, 일반적으로 그것을 오버라이드하지 않는다는 것에 동의하는 반면, 주기적으로'isCancelled'를 체크하고, 때때로 그것을 할 수 없다는 것에 동의합니다. 예를 들어 블록 기반의 'NSURLSessionTask'를 시작하면'isCancelled'를 확인할 수있는 곳이 없기 때문에 그 시나리오에서'cancel' 메소드를 오버라이드 할 것입니다. – Rob