2014-04-11 5 views
1

안녕하세요 저는 Xcode 5+ 및 iOS 7+를 사용하고 있으며 NSOperationQueue를 구현하고 있습니다. NSOpeartion의 하위 클래스를 만들고 NSOperationQueue에 50 + 작업을 추가했다고 가정 해보십시오. isExecuting 및 isFinished는 NSOperation`s에서 시작 오버라이드 (override)하는 방법 -테이크 완료 후 NSOperation이 NSOperationQueue에서 제거되지 않습니까?

-(void)start{ 

    // soeme code is here 

    [self willChangeValueForKey:@"isExecuting"]; 
    _isExecuting = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 

    [self willChangeValueForKey:@"isFinished"]; 
    _ isFinished = NO; 
    [self didChangeValueForKey:@"isFinished"]; 
} 

및 완료 작업 후 나는

[self willChangeValueForKey:@"isExecuting"]; 
    _isExecuting = NO; 
    [self didChangeValueForKey:@"isExecuting"]; 

    [self willChangeValueForKey:@"isFinished"]; 
    _ isFinished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 

MaxConcurrentOperationCount는 2입니다 그러나이 작업을 다음 (3 동작)의 완료 후 아무튼이 코드를 작성 main 메소드를 실행하지 마라. 이 문제가 언제 생길지에 대해 설명해주십시오.

감사 시작시

+0

위의 코드가 프로젝트에 해당합니다. _isFinished를 설정하지 않았습니다 ... – Volker

+0

감사합니다. 그것은 실수 였고 위의 코드를 편집했습니다. –

답변

3

, 당신은 YES-isExecuting을 설정해야하지만, 특히하지 YES에 전혀 isFinished을 설정하지 않아야합니다. 당신의 비동기 작업이 완료되면

, 당신은 NO하지 YESisExecuting을 설정해야합니다, 당신은 YES-isFinished을 설정해야하지만 isExecuting 제 2의 시간을 설정합니다.

+0

NSOperation i의 주 코드를 업데이트 한 후 isExecuting = NO, isFinished = NO로 설정하고 작업이 완료되면 isExecuting = NO, isFinished = YES로 설정하십시오. 그래서 여기에 문제가 될 것이라고 말하십시오. –

+0

작업의 시작 부분에서'isExecuting'을'YES'로 설정해야합니다. – rmaddy