7

NSoperationQueue와 관련된 문제가 있습니다. 내 코드에서 : 내 NSOperation 주요 기능의 실행 중에 그래서NSoperationQueue에서 - (void) cancelAllOperations가 대기열에있는 NSOperation의 isCancelled 속성을 설정하지 않습니다.

-(void) viewDidLoad 
{ 
    //Initialisation of queue and operation. 
    //adding operation to queue 
    [self.operationQueue addOperation:op]; 

} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self.operationQueue cancelAllOperations]; 
} 

나는 항상 NO 반환의 isCancelled 속성을 검사하고 때. NSOperationQueue에서 cancellAllOperation을 호출 한 후 실제로. 예.

-(void)main 
{ 
    if(self.isCancelled) 
    { 
    // Never executing this block :-(
    } 

} 

NSOperation.And에서 다른 네트워크로 전환 할 때 좀 더 자세한 내용을 보려면 cancelAllOperation이 호출되었습니다. 그리고 네트워크 응답 NSOperation에 돌아 왔을 때 나는 (Self.isCancelled) 그리고 지금 내가 다른보기 (isCancelled 예를 설정해야 의미)에 있는지 확인입니다. 그러나이 수표는 항상 실패합니다.

+0

cancelAllOperations를 호출 할 때까지 작업을 시작하지 않았습니까? 작업 실행 중 설정되는 isCancelled 속성이 있는지 확인해야합니다. –

+0

작업 기본 메소드에서 isCancelled 속성을 일관되게 확인하고 있습니다. 중단 점을 통해 디버그하고 cancelAllOperation 메서드를 호출 한 후 호출이이 검사 점으로 돌아 왔을 때 (self.isCancelled) 항상 반환되는 NO를 반환하는 것으로 나타났습니다. – kidsid49

+0

NSOperation에서'cancel' 메서드를 재정의하고 있습니까? 그렇다면 게시 할 수 있습니까? 그렇지 않다면 오버라이드 (super 호출)하고 로그 또는 중단 점을 호출하여 호출되는지 확인할 수 있습니까? –

답변

1

보기를로드 한 직후에 작업이 viewDidLoad에 추가되고 대기열에서 작업을 시작해야합니다.

보기가 사라지면 작업을 취소하므로 (viewWillDisappear) 작업은 현재 대부분 종료되어야합니다. 즉, 귀하의 작업은 해지 된 후에 취소됩니다. isExecuting 속성을 확인하여 작업이 활발하게 작동하는지 여부를 알 수 있습니다.

+0

작업 기본 메소드에서 isCancelled 속성을 일관되게 확인하고 있습니다. 중단 점을 통해 디버그하고 cancelAllOperation 메서드를 호출 한 후 호출이이 검사 점으로 돌아 왔을 때 (self.isCancelled) 항상 반환되는 NO를 반환하는 것으로 나타났습니다. 내 작업이 실행 중일 때만이 체크 포인트에 전화가 올 것입니다. – kidsid49

1

작업이 더 이상 실행되지 않아 취소되지 않습니다. 작업이 완료되면 작업 대기열에서 더 이상 추적하지 않으므로 cancelAllOperations을 호출하면 아무 것도 처리되지 않습니다.

대기중인 네트워크 응답이 통화를 차단하는 것이 아니라 콜백을 호출하는 경우 main으로 설정하면 작업이 이미 완료됩니다 (기본 반환). "동시"작업을 사용하여이 문제를 해결할 수 있습니다 (NSOperation 문서를 참조하십시오. 주 반환시 자동으로 수행되는 것보다 완료 시점을 나타낼 수 있음). 동기식 네트워크 호출을 사용하여 해결할 수 있습니다. 당신은 정말로 끝났습니다).

+0

나는 당신의 요점을 얻는다. 내 응답이 오면 나는 isCancelled 속성을 확인하고있다. 그렇다면 나는 그렇지 않다면 나는 응답으로 새로운 내용으로 내 tabelView를 다시로드하고있다.이제 내가 뭘하고 싶은지는 내가보기에 없다면 응답이 돌아 왔을 때 isCancelled 속성을 검사해야하고 현재 뷰에 없다면 내 tabelView를 다시로드하면 안된다. 그래서이 상황을 어떻게 처리 할 수 ​​있는지와 같은 작은 힌트를 주시겠습니까? – kidsid49

+0

글쎄, 내가 제안한 동기 네트워킹 방법을 사용할 수 있으며, 그 후에 isCancelled를 확인한다. 또는 이미 구축 된 네트워크 활동에 대한 취소 가능한 NSOperations가있는 AFNetworking과 같은 세 번째 부분 라이브러리를 사용할 수 있습니다. –

관련 문제