2010-06-28 2 views
2

Ive пытался заставить мою игру работать правильно с NSTimer. Я видел, что у многих людей была схожая проблема, и мне просто нужно кое-что разъяснить.NSTimer и обновление UI

В основном у меня есть NSTimer, работающий на основном потоке, который обновляет изображения, которые представляют время, но у меня также есть mapView. Когда пользователь нажимает карту, таймер блокируется. Мой вопрос в том, что если я создаю новый поток и добавлю таймер в свою runloop, когда я выполню селектор (который обновляет интерфейс), это не закроет поток таймера еще раз? Также я знаю, что это плохая практика для обновления пользовательского интерфейса из вторичного потока, так как я могу это сделать?

UPDATE: Я думаю, что 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

Если вы создаете поток для своего таймера, вам все равно придется обновлять пользовательский интерфейс в основном потоке. Вы можете сделать это с помощью performSelectorOnMainThread:withObject:waitUntilDone:NO, который будет помещать вызов метода в основной поток без блокировки потока таймера.

Однако, если основной поток runloop заблокирован панорамированием карты (почему?), Обновление пользовательского интерфейса все равно будет ждать в очереди событий до тех пор, пока не будет выполнена панорама карты.

+0

Спасибо за ответ. Я думаю, что таймер блокируется, поскольку он работает на основных потоках, запускает цикл alsom, поэтому, когда пользователь нажимает карту, обновление ui блокирует таймер? Является ли это ожидаемым поведением или я просто делаю это совершенно неправильно? Большое спасибо Жюль – Jules

+0

Вы можете создать [NSThread] (http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html) для запуска таймер включен, но я не думаю, что mapview должен блокировать основной поток. Я никогда не использовал mapview, поэтому я не знаю, как он себя ведет, изучали ли вы документы [MKMapView docs] (http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView. HTML)? Возможно, вы хотите перефразировать свой вопрос, чтобы быть «почему мой взгляд на карту блокирует основной поток?» и сосредоточиться на этом вместо этого. – progrmr

+0

Я обновил свой вопрос ... пожалуйста, посмотрите выше и спасибо за вашу помощь. (извинения за форматирование кода) – Jules

Смежные вопросы