2011-11-18 33 views
3

我的代碼是:我的NSTimer的選擇器不運行。爲什麼?

-(void) timerRun{...} 

-(void) createTimer 
{ 
    NSTimer *timer; 
    timer = [NSTimer timerWithTimeInterval:1.0 
            target:self 
           selector:@selector(timerRun) 
           userInfo:nil 
            repeats:YES]; 
} 

viewDidLoad 
{ 
    [NSThread detachNewThreadSelector:@selector(createTimmer) 
          toTarget:self withObject:nil]; 
    ... 

} 

當我調試,createTimer運行正常,但該方法並沒有timerRun運行的方法?

+0

'@selector(createTimmer)'大概只是一個錯字? – Tommy

+0

只是好奇你爲什麼使用另一個線程來創建定時器...是否由於某種原因,預計會長時間運行? – devios1

回答

12

只需創建一個定時器不啓動它運行。您需要同時創建它並安排它。

如果您希望它在後臺線程上運行,您實際上將不得不做更多的工作。 NSTimer附加到NSRunloop s,這是事件循環的可可形式。每個NSThread固有地有一個運行循環,但你必須告訴它明確運行。

帶有定時器的運行循環可以無限期運行,但您可能不希望它,因爲它不會爲您管理自動釋放池。

因此,總之,你可能想(i)創建計時器; (ii)將其附加到該線程的運行循環中; (三)進入一個循環,創建一個自動釋放池,運行循環一點,然後消耗自動釋放池。

代碼可能會是這樣的:

// create timer 
timer = [NSTimer timerWithTimeInterval:1.0 
           target:self 
           selector:@selector(timerRun) 
           userInfo:nil 
           repeats:YES]; 

// attach the timer to this thread's run loop 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

// pump the run loop until someone tells us to stop 
while(!someQuitCondition) 
{ 
    // create a autorelease pool 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // allow the run loop to run for, arbitrarily, 2 seconds 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]]; 

    // drain the pool 
    [pool drain]; 
} 

// clean up after the timer 
[timer invalidate]; 
+0

謝謝,我發現我的錯誤。我添加你的代碼:「while(!someQuitCondition) { //創建一個自動釋放池 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //允許運行循環運行,任意2秒 [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]]; //排水池 [pool drain]; }「,然後timerRun運行正常。 – user797876

2

您在scheduledTimerWithTimeInterval中使用的方法簽名:target:selector:userInfo:repeats:必須爲NSTimer提供參數,因爲它將自身作爲參數傳遞。

您應該將消息簽名改爲:

(void)timerRun:(NSTimer *)timer; 

你不需要用參數做任何事情,但它應該在那裏。此外,在createTimer選擇將成爲@selector(timerRun :)因爲它現在接受一個參數:

timer = [NSTimer timerWithTimeInterval:1.0 
           target:self 
          selector:@selector(timerRun:) 
          userInfo:nil 
          repeats:YES]; 
5

你必須安排一個計時器,它運行。它們被連接到一個運行循環,然後根據需要更新計時器。

您可以更改createTimer

[NSTimer scheduledTimerWithTimeInterval:1.0 
            target:self 
           selector:@selector(timerRun) 
           userInfo:nil 
            repeats:YES]; 

或添加

[[NSRunLoop currentRunLoop] addTimer:timer forModes:NSRunLoopCommonModes]; 
+0

我有變化,但方法timerRun仍然沒有運行過程中出現,當我移動碼 「[的NSTimer scheduledTimerWithTimeInterval:1.0 目標:自 選擇器:@selector(timerRun) USERINFO:無 重複:YES];」在viewDidLoad中,timerRun運行正常。我認爲問題在於不同的線程,但我想讓計時器不在mainthread中運行 – user797876

+0

看看Tommy的答案,他更加詳細並解決了您的問題。 –

相關問題