2012-03-26 11 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メソッドが呼び出され、すべてが完全に機能します。

これは長い間うまくいきました。私は最近いくつかの変更を加えています。これらの変更の1つは、デバイスをiOS 5.1 SDK(iPad)にアップグレードすることでした。

何かを追加するには、同じNSOperationオブジェクトを使用するこのアプリケーションのiPhone(iOS 5.1)バージョンがあります。違いはUIのみであり、すべて正常に動作します。

ああ、これは実際のデバイスでのみ失敗します。シミュレータでは、すべて正常に動作します。

本当にありがとうございます。

よろしく、

答えて

3

でコンパイルされたアプリケーションとの両方のiPadで働いていた、私は最終的にこの問題を解決することを確認するために

問題は、常に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

操作が同時である場合は、-main、-startを実装する必要がありません。

+0

操作は同時に行われません。ありがとう! –

0

この問題は、SDK 5.1でコンパイルされたアプリケーションを搭載したiPad 1デバイスでのみ発生します。 iOS 4.2.1のiPad 1とiOS 5.1のiPad 1を試しました。どちらも同じ問題をもたらします。これは、[OK]をSDK 4.3

2

私は同じ問題がありましたが、私の解決策は同じではなかったので、私は私のような将来の人々のために私の答えをここにも投げたいと思っていました。 、合成された場合、メソッド作成

@property CGPoint start; 

私の問題は私のNSOperationのサブクラスでは、私が持っていたということでした

-(CGPoint)start 

NSOperationの上書きします - (ボイド)を開始します。メソッドは、並行していないNSOperationのシニファイターであり、 - (void)startが起こるのを防ぐため、 - (void)mainメソッドがまったく呼び出されないようにしていました。

私のプロパティをstart以外の名前に変更すると、うまくいきました。

関連する問題