2011-07-13 52 views
2

我有一個奇怪的問題。沒有CFRunLoop,我的NSTimer CallMe方法不會被觸發。如果我添加CFRunLoop,則CFRunLoop之後的行永遠不會被調用。我想要CFRunLoop和CallMe方法之後的行都被觸發。NSTimer與CFRunLoop

編輯 - 我不在乎CFRunLoop只是想讓計時器每20秒觸發一次。

我添加的代碼及以下

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()