我一直试图让我的游戏与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