2012-03-26 3 views
4

정말 도움이 필요합니다. 나는이 시점에서 필사적이다.NSOperationQueue 내의 NSOperation이 실행되지 않습니다.

NSOperationQueue에 추가 될 때 트리거되지 않는 NSOperation이 있습니다. 나는 NSOperation 상태를 확인하기 위해 몇 가지 로깅을 추가하고이 결과 :

Queue operations count = 1 
Queue isSuspended = 0 
Operation isCancelled? = 0 
Operation isConcurrent? = 0 
Operation isFinished? = 0 
Operation isExecuted? = 0 
Operation isReady? = 1 
Operation dependencies? = 0 

코드는 매우 간단합니다. 특별한 것은 없습니다.

 LoadingConflictEvents_iPad *loadingEvents = [[LoadingConflictEvents_iPad alloc] initWithNibName:@"LoadingConflictEvents_iPad" bundle:[NSBundle mainBundle]]; 

     loadingEvents.modalPresentationStyle = UIModalPresentationFormSheet; 
     loadingEvents.conflictOpDelegate = self; 

     [self presentModalViewController:loadingEvents animated:NO]; 

     [loadingEvents release]; 

     ConflictEventOperation *operation = [[ConflictEventOperation alloc] initWithParameters:wiLr.formNumber pWI_ID:wiLr.wi_id]; 

     [queue addOperation:operation];   

     NSLog(@"Queue operations count = %d",[queue operationCount]); 
     NSLog(@"Queue isSuspended = %d",[queue isSuspended]); 
     NSLog(@"Operation isCancelled? = %d",[operation isCancelled]); 
     NSLog(@"Operation isConcurrent? = %d",[operation isConcurrent]); 
     NSLog(@"Operation isFinished? = %d",[operation isFinished]); 
     NSLog(@"Operation isExecuted? = %d",[operation isExecuting]); 
     NSLog(@"Operation isReady? = %d",[operation isReady]); 
     NSLog(@"Operation dependencies? = %d",[[operation dependencies] count]); 


     [operation release]; 

이제 내 작업은 메인 메서드에서 많은 일을하지만 문제는 결코 호출되지 않습니다. 메인은 실행되지 않습니다. 가장 이상한 것 (나를 믿어 라. 나는 아직 미치지 않았다.). NSLog 라인에 중단 점을 넣거나 작업을 만들면 main 메서드가 호출되고 모든 것이 완벽하게 작동합니다.

오랫동안 정상적으로 작동했습니다. 나는 최근에 약간의 변화를 일으켰으며 분명히 뭔가를 망쳐 놓았다. 그 중 하나가 iOS 5.1 SDK (iPad)로 업그레이드하는 것입니다.

뭔가 추가하려면 동일한 NSOperation 개체를 사용하는이 응용 프로그램의 iPhone (iOS 5.1) 버전이 있어야합니다. 차이는 UI에서만 발생하며 모든 것이 정상적으로 작동합니다.

아, 실제 장치에서만 오류가 발생합니다. 시뮬레이터에서 모든 것이 정상적으로 작동합니다.

도움이 될 것입니다. 작업이 동시 경우

감사합니다,

답변

3

확인 SDK로 컴파일 된 응용 프로그램에 모두 아이 패드에서 일하고 있었다.

내가 겪고있는 문제는 백그라운드에서 항상 실행중인 NSOperation 때문이었습니다 (그러나 다른 대기열에 있음). 이 작업은 실행될 다른 스레드 (NSOperation)를 차단하고있었습니다. 이것은 듀얼 코어가 아니기 때문에 iPad 1에서만 발생했습니다.

내 NSOperation는 main 메소드에이 같은 일을했다 :

- (void)main 
{ 
    while (![self isCancelled]) { 
     //Do stuff 
    } 
} 

그리고 NSOperation하는 contantly 그것을 전체 시간을하고 있던 것은

바보 나, 나는 일할 수있는 OS 시간을주지 않았다 다른 스레드와 잠을 더하면 트릭을 만들었습니다.

- (void)main 
{ 
    while (![self isCancelled]) { 
     [NSThread sleepForTimeInterval:0.5]; 
     //Do Stuff 
    } 
} 

OS가 다른 스레드와 함께 작동 할 수있는 기회를 제공합니다.

왜 중단 점을 넣고 작업을하고 있었습니까? ... 디버거가 모든 스레드를 중지하고 중단 점이 다른 NSOperation에 있었으므로 해당 스레드가 실행되었습니다.

+0

그것은 계몽적인 디버깅 세션 이었음에 틀림 없습니다. 나를 위해, 그것은했다. –

+0

그래서 .... 우리는 매 시간마다 수면을해야합니까? 나는 그것을 얻지 않는다. –

5

, 당신은 - 주요, -start을하지 구현해야합니다.

+0

작업이 동시에 수행되지 않습니다. 감사 ! –

0

이 문제는 SDK 5.1로 컴파일 된 응용 프로그램이 설치된 iPad 1 기기에서만 발생합니다. iPad 1 (iOS 4.2.1) 및 iPad 1 (iOS 5.1)을 사용해 보았습니다. 둘 다 똑같은 문제를 일으킨다.

은 확실히이 마침내이 문제를 해결, 4.3

2

같은 문제가 있었지만 해상도가 같지 않아서 나와 같은 미래의 사람들에게도 내 대답을 던지 리라고 생각했습니다. 합성 할 때, 방법 생성

@property CGPoint start; 

:

내 문제는 내 NSOperation 하위 클래스에서, 내가 가진 것이 었습니다

-(CGPoint)start 

NSOperation의 무시 - (무효)를 시작; 메서드는 비 동시적인 NSOperation에 대한 표시 자이며 - (void) start가 진행되는 것을 막아서 - (void) main 메서드가 전혀 호출되지 않도록합니다.

일단 속성을 시작 이외의 다른 이름으로 변경하면 정상적으로 작동합니다.