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 오류를 범;
나는 계측기에서 코드를 실행했지만 여전히 오류가 발생하는 이유를 알 수 없습니다. 어떤 아이디어?
답장을 보내 주셔서 감사합니다. 나는 메인 스레드가 루프 alsom을 실행하므로 사용자가 맵을 패닝 할 때 UI 업데이트가 타이머를 차단하고 있으므로 타이머가 블로킹한다고 생각 하는가 ?? 이것은 예상되는 행동입니까 아니면 완전히 잘못하고 있습니까? 많은 감사 쥘 – Jules
당신은이 [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
내 질문을 업데이트했습니다 ... 위를 보시고 도움을 주셔서 감사합니다. (코드 형식화에 대한 사과) – Jules