2010-02-14 2 views
0

매분마다 화면을 업데이트해야하는 응용 프로그램이 있습니다. 이를 위해 performSelector : withObject : afterDelay를 사용하여 셀렉터를 호출하여 매우 간단하고 신속한 계산을 기반으로 레이블의 텍스트를 변경합니다.응답이없는 iPhone UI 디버그

[self performSelector:@selector(updateDisplay) withObject:nil 
    afterDelay:60]; 

때때로 업데이트하는 동안, 나는 꺼지고 웹에서 일부 데이터를 얻을 수 있고, 그래서 다른 스레드에서 detachNewThreadSelector를 사용하여 그렇게. 모든 것이 작동하고 "performSelector after Delay"호출은 초 단위로 완료되며 1 분에 한 번만 실행됩니다. 그럼에도 불구하고 시뮬레이터에서 정상적으로 실행 되더라도 앱의 단일 버튼은 응답이 없으며 여러 번의 찌르기에 응답하지 않습니다.

따라서 peformSelector : afterDelay가 차단되지 않았다고 가정했지만 이제는 어떤 방식으로 차단되는지 궁금합니다. 나는 심지어 웹 - 조회 - 업을하지 않으려 고 노력했는데 이것은 여전히 ​​응답성에 영향을 미쳤다. 기쁨이 없습니다.

[NSThread detachNewThreadSelector:@selector(updateFromURL) 
    toTarget:self withObject:nil]; 

그런 다음 나는 상어를 통해 그것을 밀어 분명히 볼 수 있는지 확인했습니다. 여기에서 나는 웹 검색이 언제든지 걸리는 유일한 일인 것을 볼 수 있지만, 단지 2 분마다 한 번만하고, 주 스레드에서는 분명히 실행되지 않습니다. 앱 자체는 20 분에 1 %의 CPU 점유율 (0.0000034 %)을 소비하므로 블로킹 문제 일뿐입니다.

그래서 performSelector : afterDelay에 대해 뭔가 빠졌습니까? 다른 일반적인 초보자 실수는 무엇입니까? 도움이된다면 20 년 이상 응용 프로그램을 개발해 왔지만 이전 10 개는 대부분 자바였습니다. 아마도 나는 자바가로드 된 :-) 본질적으로 나는 메인 스레드가 EDT (그것에 UI 물건을 할하지만 다른 모든 것을 유지)와 같은 가정했다.

답변

1

performSelectorInBackground를 대신 사용하고 불리언 세마포 또는 요청 수의 대기열을 유지하는 것은 어떻습니까?

사용 사례를 정의해야합니다. 버튼을 매시하는 경우 요청을 한 번 또는 반복해서해야합니까?

+0

다중 요청 문제가 없으며 첫 번째 요청을받지 못했습니다. 나는 어떤 무거운 프로파일 링을했는데, 아무런 실질 가치도 없다. (문제가 없다는 것을 제외하고). performSelector : afterDelay보다는 타이머를 사용하고 다시 사용했기 때문에 도움이 된 것처럼 보입니다. 실행 루프의 일부 미묘한 부분이 여기에있는 것 같습니다. – rougeExciter