2010-06-28 37 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