2010-06-28 5 views
2

NSTimer으로 게임이 올바르게 작동하려고했습니다. 많은 사람들이 저와 비슷한 문제를 겪고있는 것을 보았습니다. 나는 뭔가에 대해 약간의 설명이 필요합니다.NSTimer 및 UI 업데이트

기본적으로 나는 시간을 나타내는 이미지를 업데이트하는 주 스레드에서 실행되는 NSTimer을 가지고 있지만 mapView도 가지고 있습니다. 사용자가지도를 팬하면 타이머가 차단됩니다. 내 질문은 새 스레드를 만들고 runloop에 타이머를 추가 할 때 선택기 (UI 업데이트)가 타이머 스레드를 다시 차단하지 않을 때 실행하는 것입니다. 또한 UI에서 보조 스레드로 업데이트하는 것이 나쁜 습관이라는 것을 알고 있습니다. 어떻게 그렇게할까요?

업데이트 : mapView는 둘 다 동일한 실행 루프에서 실행 중이므로 타이머를 차단하고 있다고 생각합니다. 그러나 이제는 자체 실행 루프가있는 타이머 스레드로이 문제를 해결했습니다. 그러나이 문제로 인해 제 2의 문제가 생겼습니다. 다음 코드는 ...

//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:을 사용하면 타이머 스레드를 차단하지 않고 주 스레드에서 메서드 호출을 대기시킵니다.

그러나 메인 패의 runloop이 맵 패닝 (왜?)에 의해 차단되면 맵 업데이트가 완료 될 때까지 UI 업데이트가 여전히 이벤트 대기열에서 대기합니다.

+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