2011-07-13 7 views
2

私は奇妙な問題を抱えています。私のNSTimer CallMeメソッドはCFRunLoopなしでは起動しません。 CFRunLoopを追加すると、CFRunLoopの後の行は決して呼び出されません。私はCFRunLoopとCallMeメソッドの後に両方の行を起動する必要があります。NSTimer with CFRunLoop

EDIT - CFRunLoopについて気にしないでください。ちょうどタイマーが20秒ごとに起動するようにしてください。

Iコードと

int main(int argc, char * const argv[]) { 
Updater *theUpdater = [[Updater alloc] init]; 
NSTimer *theTimer = [theUpdater getTimer]; 
[theTimer retain]; 
//CFRunLoopRun(); 
NSLog(@"I am here"); //If I uncomment CFRUnLoop this line does not get executed 
} 

@implementationアップデータ

- (NSTimer *)getTimer { 
NSLog(@"Timer started"); 
NSTimer *theTimer; 
theTimer = [NSTimer scheduledTimerWithTimeInterval:20.0 
               target:self 
             selector:@selector(CallMe:) 
             userInfo:nil 
             repeats:YES]; 

return theTimer; 

}

-(void) CallMe:(NSTimer*)theTimer{ 
NSLog(@"I Never get called"); 
} 

@end

答えて

2

CFRunLoopのコンテキストでタイマーを作成する必要があります。だからあなたのコードはより次のようになります。

NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop]; 

Updater * theUpdater = [[Updater alloc] init]; 

[myRunLoop run] 

それはその所有者であるので、あなたは、アップデータオブジェクトは、あなたのタイマーを保持している必要があります。 を実行すると、終了することはないという意味で、関数が呼び出されることに注意してください。他のオプションについては、NSRunLoopのドキュメントを参照してください。

1

これは正常な動作である以下のコメントを追加しました。 CFRunLoopドキュメント(強調は筆者)から:

CFRunLoopRun

デフォルトモードで無期限 を現在のスレッドのCFRunLoopオブジェクトを実行します。言い換えれば

CFRunLoopRun()あなたがCFRunLoopStop()どこかを呼び出さない限り、返すことはありません。