2010-06-28 38 views
2

我一直試圖讓我的遊戲與NSTimer正常工作。我見過很多人遇到過類似的問題,我只是需要澄清一些事情。NSTimer和更新UI

基本上我有一個NSTimer運行在更新圖像代表時間的主線程,但我也有一個mapView。當用戶平移地圖時,計時器被阻止。我的問題是,如果我創建一個新線程並將計時器添加到其runloop,當我執行選擇器(更新UI)將不會再次阻止計時器線程?另外我知道從輔助線程更新UI是不好的做法,所以我該如何去做呢?

更新:我認爲mapView阻塞了計時器,因爲它們都在同一個運行循環中運行。我現在用一個帶有自己的運行循環的計時器線程修復了這個問題,但是這導致我出現了第二個問題,這讓我非常困惑!下面是代碼...

//called when I need to restart the timer 
[NSThread detachNewThreadSelector:@selector(resumeTimer) toTarget:self withObject:nil]; 


-(void) restartTimer { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    timer=[NSTimerscheduledTimerWithTimeInterval:1. 
              target:self 
             selector:@selector(dim) 
             userInfo:nil 
             repeats:YES]; 

    [self performSelectorOnMainThread:@selector(timerImageUpdate) 
          withObject:nil 
         waitUntilDone:NO]; 

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 

    [pool drain]; 
} 

此代碼給我上的[池排水]一個Bad_access錯誤;

我已經運行儀器中的代碼,仍然無法看到它爲什麼會給我錯誤。有任何想法嗎?

回答

2

如果您爲您的計時器創建一個線程,您仍然需要在主線程上執行UI更新。你可以用performSelectorOnMainThread:withObject:waitUntilDone:NO這樣做,它將在主線程上排隊方法調用而不阻塞定時器線程。

但是,如果主線程的runloop被地圖平移(爲什麼?)阻塞,UI更新仍將在事件隊列中等待直到地圖平移完成。

+0

感謝您的回覆。我認爲計時器阻塞,因爲它運行在主線程運行循環alsom所以當用戶平移地圖的UI更新阻止計時器?這是預期的行爲還是我完全錯了? 非常感謝 朱 – Jules 2010-06-28 13:49:21

+0

您可以創建一個[NSThread(http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html)運行計時器中,但我不認爲該mapview應該阻止主線程。我從來沒有使用過mapview,所以我不知道它的行爲如何,你學習了[MKMapView文檔](http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView。 HTML)?也許你想將你的問題改爲「爲什麼我的地圖視圖阻止了主線程?」而是專注於此。 – progrmr 2010-06-28 14:14:46

+0

我已經更新了我的問題......請看看上面的內容並感謝您的幫助。 (道歉代碼的格式) – Jules 2010-06-29 13:18:47