我一直試圖讓我的遊戲與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錯誤;
我已經運行儀器中的代碼,仍然無法看到它爲什麼會給我錯誤。有任何想法嗎?
感謝您的回覆。我認爲計時器阻塞,因爲它運行在主線程運行循環alsom所以當用戶平移地圖的UI更新阻止計時器?這是預期的行爲還是我完全錯了? 非常感謝 朱 – Jules 2010-06-28 13:49:21
您可以創建一個[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
我已經更新了我的問題......請看看上面的內容並感謝您的幫助。 (道歉代碼的格式) – Jules 2010-06-29 13:18:47