2014-09-09 2 views
0

작업 내에서 NSInvocationOperation을 취소해도 올바르게 작동합니까? 예 :NSInvocationOperation 사용을 취소하십시오

.H 파일 :

//defined in the interface 
NSInvocationOperation *op1; 
NSOperationQueue *loadQueue; 

하는 .m 파일 :

-(id)init{ 
    op1 = [NSInvocationOperation new]; 
    loadQueue = [NSOperationQueue new]; 
} 

-(void)downloadData{ 
    op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadServerResponse:) object:newerRequest]; 
    [loadQueue addOperation:op1]; 
} 

이 지금은 서버에서 데이터를 다운로드하는 방법이있다. 오류가 있는지 확인하기위한 조건을 추가했습니다. 그렇다면 메서드 내에서 해당 작업을 취소하고 새 로그인 토큰을 검색 할 때 동일한 메서드를 다시 호출합니다.

- (void)loadServerResponse{ 
    if(server_error){ 
     [op1 cancel]; 
     //fetch login token again 
     [self downloadData]; 
     return; 
    } 

뭐가 잘못 되었나요?

답변

1

우선, 복수 레벨의 Bad Thing ™은 NSHperationQueue가 작업을 백그라운드 스레드에 전달하기 때문에 op1을 참조하므로 op1 (기껏해야)을 해당 스레드의 컨텍스트에 복사하고 취소하려고 시도한 원래 작업을 더 이상 참조하지 않습니다.

공유 논리를 고려할 때 작업 취소에 대해 걱정할 필요가 없다고 생각합니다. 취소 후 downloadData 번으로 전화를 걸고 싶을 것 같습니다. 먼저 작업을 취소하면 문제가 발생하지 않을 것입니다. 나는 그 작업을 취소하기 위해 호출을 제거하고 계속 진행할 것이다. 일반적으로 외부 소스에서 실행중인 작업 만 취소합니다 (예를 들어 응용 프로그램이 백그라운드 상태로 들어간다는 알림을받는 경우).

+0

당신이 말한 것이 사실이라면 어떻게 NSInvocationOperation 개체에 액세스하여 취소 (또는 다른 방법) 할 수 있습니까? – 2cupsOfTech

+0

좋은 질문 -이 특정 예제에서 OP는 작업이 실행하려고 시도했던 메서드 내에서 취소하려고 시도하고있었습니다. 이는 일반적으로 나쁜 생각으로 간주되는 스레드 경계에서 객체를 참조하려고 시도했음을 의미합니다. cancel을 호출하려면 작업을 대기열에 넣은 원래 스레드에서 호출하거나 NSOperation을 서브 클래스 화하고 내부적으로 관리해야합니다. –

+0

이 좋습니다. 비슷한 일을하고 있지만 취소는 메서드에서 실행까지가 아닌 외부에서 발생합니다. 그렇게해야한다고 생각합니다. 나는 메소드 - 실행 내에서 isCancelled를 처리한다. – 2cupsOfTech

관련 문제