2011-12-21 2 views
0

응용 프로그램이 인터페이스 이벤트에 올바르게 응답하지 않게하려면 어떻게합니까? 내가 직면 한 한 가지 문제는 내 앱이 모든 종류의 애니메이션을 중단하는 것입니다. 예를 들어 키보드가 움직이지 않고 화면에 나타납니다. 장치의 회전은 애니메이션이 아니며 애니메이션없이 회전합니다. UIAlertView는 애니메이션없이 표시하고 닫습니다.iPad 응용 프로그램이 인터페이스 이벤트에 올바르게 응답하지 않음

저는 초당 여러 객체를 생성하고 해제하는 고성능 응용 프로그램을 개발하고 있습니다. 가능한 한 적은 메모리를 사용하려고합니다. 설명하는이 문제는 메모리 경고에 의해 선행되지 않으며 모든 예외를 포착하지 않습니다 (모든 로그를 기록합니다).

누군가 나에게 조언을 해줄 수 있다면 정말 고맙겠습니다.

Obs : 다른 점이 있습니다. 내 앱에서이 문제가 발생하면 uiview 애니메이션이 중단됩니다. 그러나 CALayer 애니메이션은 정상적으로 실행됩니다. 거기에 대한 설명이 있습니까?

답변

1

메인 스레드를 차단하는 작업을하는 것처럼 들립니다. 모든 UI는 주 스레드에서 수행되므로 일부 계산을 긴 시간 수행하면 UI가 응답을 멈 춥니 다. 동기 URL 요청을 수행하고 있습니까? 다시 말하지만, 이것은 메인 스레드를 막을 것입니다.

당신은 애플의 Concurrency Programming Guide를 살펴 보자 GCD 또는 NSOperations

를 사용하여이 작업을 수행 ... 가능한 배경 스레드에 많은 비 UI 코드를 이동해야합니다. 당신이해야합니까 곳 NSThreads에

애플의 포획 ...

* ... 스레드에서 멀리 이동하는 모든 경우에 가능하지 않을 수, 성능 (그리고 코드의 단순) 장소에서 극적으로 향상시킬 수 있습니다 스위치. 특히, 스레드 대신 파견 큐와 작업 큐를 사용하여 몇 가지 장점이 있습니다 :

  • 그것은 응용 프로그램이 응용 프로그램의 메모리 공간에서 스레드 스택을 저장하기 위해 지불하는 메모리의 벌금을 줄일 수 있습니다.
  • 스레드를 만들고 구성하는 데 필요한 코드가 필요하지 않습니다.
  • 스레드에서 작업을 관리하고 예약하는 데 필요한 코드가 필요하지 않습니다.
  • 작성해야하는 코드가 간단 해집니다.

또한 NSThread와 NSOperationQueue의 this question을 참조하십시오.

+0

확인해 보겠습니다. 데이터 스트리밍을 처리하기 위해 백그라운드에서 실행되는 스레드가 있고 여러 웹 서비스를 호출합니다. 웹 서비스는 비동기식으로 수행하고 스트리밍은 NSThread를 사용하고 있습니다. NSOperations는 NSThread보다 우수한 성능을 제공합니까? 또 다른 한가지 : 메인 스레드가 막히면 앱을 멈추지 않아야합니까? 여기 내 문제를 보여주는 비디오의 링크입니다 : [link] http://www.youtube.com/watch?v=eFOpPofnSnw&feature=youtu.be – Leonardo

+0

또 다른 점은 제가 궁금 해서요 : 내 앱에서 내가 가지고있을 때 이 문제는 uiview 애니메이션이 발생하는 것을 멈 춥니 다. 그러나 CALayer 애니메이션은 정상적으로 발생합니다. 거기에 대한 설명이 있습니까? – Leonardo

0

아마도 장기 실행을 통해 주 스레드를 차단하고있을 것입니다. 코드에서 폴링 중이거나 반복 중입니까? 만약 당신이 (당신이하지 말아야 할), 당신이 배경 스레드에서 그것을 할 수 있는지 확인하십시오.

0

CALayer 변환 업데이트는 주 스레드보다 우선 순위가 높을 수 있으므로 주 UI 스레드가 차단 된 경우에도 볼 수 있습니다. 그러나 주 스레드가 차단되어있는 한 UI 업데이트가 발생하지 않습니다. UI 개체는 주 스레드를 차단하는 동안 고정됩니다.

UI 애니메이션을 매끄럽게하려면 모든 주 스레드 처리에서 UI 실행 루프 (자주 초당 30 회 이상)로 돌아갈 수 있어야합니다.

+0

메인 스레드 처리와 메인 스레드 처리의 차이점은 무엇입니까? 나는 이런 종류의 구별을하지 못했습니다 .... 적어도 초당 30 번 말할 때, 그것을 제어 할 수 있습니까? – Leonardo

+0

iOS 앱에서 주 스레드는 UI 스레드이기도합니다. 신속하게 수행 할 수없는 작업 (수십 mS)은 다른 스레드에서 수행하거나 비동기 적으로 수행해야합니다. – hotpaw2

관련 문제