2011-03-21 2 views
0

내 iPhone 응용 프로그램에서 배경으로 작업을 수행하기 위해 만든 보조 스레드가 있고 몇 밀리 초마다보기가 업데이트되어야합니다 (메인 스레드가 아닌). 내 UIView 하위에 다음 코드를 시도 :UIView setNeedsDisplay 메인 스레드에 있지 않습니까?

시뮬레이터에 좋은 작품
[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO]; 

그러나 내 장치에 매우 랙이있다. 내가 생각할 수있는 유일한 것은 메인 스레드가 UIKit의 일상적인 루틴에 빠져 있다는 것입니다. 즉, 내 setNeedsDisplay가 (약 1/2 초 후에) 길게 호출 된 것을 의미합니다. 다른 코드에서는 사용자 상호 작용에 기반하여 setNeedsDisplay를 즉시 호출하기 때문에 어떤 지연도없이 정상적으로 작동합니다. 보조 스레드에서 사용자 인터페이스 스레드보다 백엔드 계산이 적습니다. 이것은 내 응용 프로그램에서 아주 나쁜 시각 효과를 초래합니다.

그래서 요약하면이 문제를 어떻게 해결할 수 있습니까?


UPDATE :

은 그 자체 X 회 초를 새로 고칠 필요가있는 뷰를 말하는 나를위한 또 다른 방법이 있습니까? 그게 가능한 경우 나를 위해 더 나은 성능이 끝날 수 있습니다. 나는 성공없이 CADisplayLink를 시도했다. ...

답변

3

UI가 너무 심해서 통화량이 그만큼 지연되는 경우 UI 업데이트를 조금씩 배치하거나 TableView의 일괄 처리에 대한 beginUpdate/endUpdate를 수행하십시오. 업데이트 (예 :)

MonoTouch에서 비슷한 작업을하고 있으며 그 정도의 지연이 보이지 않습니다. 내 모든 업데이트는 앱과 동일한 방식으로 백그라운드 스레드에서 발생합니다.

주 UI가 더 많은 CPU 시간을 사용할 수있는 경우 백그라운드 스레드 우선 순위를 낮추고 도움이되는지 확인하십시오.

+0

무엇이 우선 순위가 좋을까요? 나는 0.1로 설정했지만 여전히 뒤떨어져있다. –

+1

Nevermind는'[NSTimer scheduledTimerWithTimeInterval : 0.1 target : 셀렉터 : @selector (setNeedsDisplay) userInfo : nil repeats : YES];를 사용 했으므로 이제는 제대로 작동하는 것 같다. –