2011-02-02 5 views
0

親愛なるコミュニティ。 は、私がセットアップNSTimerにしてみてください:NSTimer in NSOperationサブクラス

@interface GetExternalInfo : NSOperation { 

NSTimer *keepAliveTimerMain; 

@property (nonatomic,retain) NSTimer *keepAliveTimerMain; 

.M:

@synthesize keepAliveTimerMain 

-(void) main; 
{ 
self.keepAliveTimerMain = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(keepAlive:) userInfo:nil repeats:YES]; 
[keepAliveTimerMain fire]; 
[[NSRunLoop currentRunLoop] addTimer:self.keepAliveTimerMain forMode: NSDefaultRunLoopMode]; 

BOOL timerState = [keepAliveTimerMain isValid]; 
NSLog(@"STAT:Timer Validity is: %@", [email protected]"YES":@"NO"); 


- (void)keepAlive:(NSTimer *)theTimer 
{ 
    BOOL currentState = [self isCancelled]; 
    NSLog(@"STAT:cancelled state is %@.\n",[email protected]"YES":@"NO"); 
} 

ログに

2011-02-02 18:58:31.041 雪[54705を:5d07] STATは、 :キャンセルされた状態 はNOです。 2011-02-02 18:58:31.042 雪[54705:5d07] STAT:タイマ有効 は次のとおりです。YES

私は一度だけこれを参照してください。 5秒ごとに次の繰り返しを試みることはありません この場合は、 GCが有効になっています。

答えて

2

現在のスレッドにrunloopがありますか?タイマーは射撃できるようにランループが必要です。​​がなぜ呼び出されたのかを説明する-fireを手動で呼びますが、実際にはタイマーは起動しません。

+0

私はこれをやろうとしていましたが、間違った場所にいると思います。私はinitメソッドからそれをやろうとしていました。私が今理解しているように、initメソッドは他のスレッドで動作しています。タイマーは起動できません。編集された質問に見られるように私は結果を – Alex

1

[[NSRunLoop currentRunLoop] addTimer:keepAliveTimerMain forMode: NSDefaultRunLoopMode];のような実行ループにタイマーを追加する必要があります。

編集:あなたが掲示したコードはの手作業でをrunloopに追加する前に起動したことを示しています。これにより、タイマーが起動し無効になるので、実際には無効なタイマーを実行ループにスケジュールしようとしています。そのため、NSLogメッセージは一度しか表示されません。

+0

知らせてみましょう - 同じ結果 – Alex