2009-04-18 5 views
9

백그라운드에서 일련의 NSXMLDocuments를 UI에 응답 적으로 다운로드하고 구문 분석 할 NSInvocationOperation이 있습니다.NSInvocationOperation을 중지하는 방법은 무엇입니까?

Invocation 작업을 중지하려는 시도는 NSOperationQueue의 cancellAllOperations를 호출하는 것입니다. 그러나 이것은 호출의 실행을 멈추지 않을 것으로 보인다.

이 문제에 대해 어떻게 생각하나요?

답변

3

NSOperation 개체의 구현에 따라 실제로는 을 중지하고 취소하고 취소되었다는 알림을 받으면 종료하십시오. 큐의 모든 조작을 취소하려는 메시징은 큐가 새로운 조작의 큐 해제를 중지하게하고 현재 실행중인 조작으로 취소 메시지를 전송합니다.

작업의 주 방법에서는 실제로 취소 할 때 isCancelled을 확인하고 해당 상태를 처리해야합니다.

자세한 내용은 스레딩 프로그래밍 가이드의 Creating and Managing Operation Objects을 참조하십시오.

+0

다른 답변을 보면,'NSInvocationOperation'을 사용할 때 (보통 isCancelled를 확인하는 표준 방법으로는) 할 수없는 것 같습니다. – jrdioko

5

위의 게시물은 훌륭하지만 더 직접적으로 원래 질문에 대답합니다. 취소를 지원하지 않기 때문에 NSInvocationOperation 개체를 중지 할 수없는 것처럼 보입니다. 당신은 그것을 서브 클래스 화해야 할 것입니다.

11

업데이트 : 인스트루먼트는 누출을 많이 보여줍니다. 주의해서 진행하십시오! 내가 실제로 뭔가를하고 있고 누군가 다른 사람이 누설 장애물을 극복하는 방법을 알아낼 수 있기 때문에 여기에 이것을 보관할 것입니다.

NSInvocationOperationinitWithTarget의 객체로 작업을 설정합니다 : 선택 : 객체를 : 방법을

여기에 내가 이것을 입력 내가 다시 시도하고 꼬인 아이디어입니다. 우리는 자신의 전화에 ALLOC 떨어져 휴식해야

NSInvocationOperation *operation = [NSInvocationOperation alloc]; 
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation]; 
[queue addOperation:operation]; 
[operation release]; 

참고 : NSOperationQueue 이미이 가정하면 (우리는 그것을 전화 할게). 그렇지 않으면 개체를에서 까지 설정할 수 없습니다.!

그런 다음 조작 방법 내에서 개체를 다시 캐스팅하고 의 검사를 원하는대로 취소하십시오 (캔크레이드). 예를 들면 : 당신이 지금 객체에 전달 될 것이기 때문에, ... 전화 :

- (void)myOperation:(id)object { 
    NSInvocationOperation *operation = (NSInvocationOperation *)object; 
    if ([operation isCancelled]) return; 
    ... 
    } 

당신의 선택은 다시 initWithTarget에서 콜론으로 끝나는 있는지 확인합니다.

지금까지 그렇게 좋았습니다. 이제 강제로 할 수 있다면 cancelAllOperations, 이것이 실제로 작동하는지 알 수 있습니다. :)

+0

유출로 인해 사용하지 마십시오. 그러나 아이디어는 좋습니다! –

8

NSInvocationOperation isCancelled가 YES인지 확인해야합니다.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 

보고 그런

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:<targetObj> selector:@selector(<targetMethod>) object:nil]; 
[operation addObserver:<targetObj> forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil]; 
[operQueue addOperation:operation]; 
[operation release]; 

이 targetObj에서 구현 : 작업을 실행할 때

이 NSInvocationOperation의 isCancelled 관찰자로 개체를 추가 는 NSInvocationOperation, 당신은 키 값 관측을 사용할 수있는 것을해야 할 일 NSOperationQueue의 cancellAllOperations에 의해 isCancelled가 변경되었습니다. 여기에 비공개 플래그를 설정할 수 있으며 targetMethod가이를 확인하고 필요한 경우 취소 할 수 있습니다.

관련 문제