2014-07-23 4 views
2

작업 대기열에서 모든 작업을 취소해야합니다. 그러나 호출 cancelAllOperation 메서드 후에는 작업이 여전히 실행 중입니다. 간단한 예 : sleep 모닝콜하지 않습니다 작업을 취소취소 된 작업이 아직 실행 중입니다.

@interface MyOperation : NSOperation 
@end 
@implementation MyOperation 
-(void)main { 
    NSLog(@"starting 1"); 
    sleep(4); 
    NSLog(@"finished 1"); 
} 
@end 
@interface ViewController() 
@end 
@implementation ViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    MyOperation *op = [MyOperation new]; 
    [queue addOperation:op]; 
    sleep(2); 
    [queue cancelAllOperations]; 
    NSLog(@"canceled"); 
} 
log: 
2014-07-23 09:55:48.839 MDict1[837:1303] starting 1 
2014-07-23 09:55:50.842 MDict1[837:70b] canceled 
2014-07-23 09:55:52.842 MDict1[837:1303] finished 1 

답변

1

. 그리고 sleepviewDidLoad에 부르는 것은 나쁜 것입니다. 주 스레드에서 절대로 절대로.

올바른 해결책은 메서드의 구현이 self이 취소되었는지 확인해야한다는 것입니다. 그렇다면 반환해야합니다.

한 거친 예는 다음과 같을 수 있습니다

- (void)main { 
    while (!self.isCancelled) { 
     // do some repeated operation 
    } 
} 

다시 말하지만,이 취소 된 것을 볼 때 그 자체를 막을 수있는 작업의 책임입니다. 대기열은 실제로 어떤 작업도 종료하지 않습니다. NSOperationQueue cancelAllOperations (강조 광산) 용 문서에서

:

이 메소드는 큐에있는 모든 동작을 취소 메시지를 전송한다. 대기중인 작업은 실행을 시작하기 전에 취소됩니다. 작업이 이미 실행중인 경우 작업을 취소하고 해당 작업을 중지하는 것은 해당 작업까지입니다.

+0

그 전에 어떤 일을하기 전에 isCancelled 속성을 확인해야합니까? – congnd

+0

작업을 시작하기 전에 작업을 취소하면 대부분 손상되지 않지만'main'은 호출되지 않습니다. – rmaddy

+0

오케이, 이해합니다. 감사합니다. – congnd

관련 문제