2012-08-21 2 views
0

나는 내 UIPickerView가 계산 작업에 의해 "굶어 죽었다"는 상황이 있습니다. 즉, UIPickerView는 결코 업데이트되지 않으며 따라서 메시지를 보내지 않습니다. 매우 무거운 컴퓨팅 작업이 일어나기 때문입니다. 피커는 계산의 양상을 제어하므로 두 개가 훌륭하게 작동해야합니다.UIPickerView "선점"메시지?

계산을 별도의 스레드에서 실행하려고 생각했습니다. 피커를 자유롭게 업데이트 할 수있는 것처럼 보입니다. 그러나, 그것은 내 계산을 다중 스레드 가능하게 만드는 방대한 사업 일 것이므로 다른 해결책을 찾고 싶습니다.

피커 (또는 다른 UI 컨트롤)가 코드 블록의 실행을 "선점"할 수 있습니까? 계산이 반복됩니다. iterations의 숫자가 무거운 무엇입니까. 픽커가 어딘가에 플래그를 설정할 수도있는 경우 루프가 중단되어 프로그램의 흐름과 함께 작동 할 수 있습니다.

루프가 피커를 폴링 할 수 있으면 루프도 작동합니다. 그러나 나는 그렇게 할 수있는 방법을 찾지 못했습니다.

아이디어가 있으십니까?

는 (. PS는 어제 비슷한 질문을 게시하지만, 정말 제대로 요구하지 않았다! - 확실히 문제가 그 시간에 무엇을 알고하지 않았다)

답변

0

을 당신이 플래그를 의미하는 가정의 경우 그 선택기가 이동되면 플래그를 설정하십시오. 그렇다면 당신은 이것을 할 수 있습니다 - 피커 대리자를보고, 그들 중 일부 또는 전부가 호출되면 플래그를 설정하십시오. 계산이 다른 클래스 또는 다른 클래스에 의해 수행 된 경우 "취소됨"클래스에서 새 특성을 작성하고 피커가이를 설정할 수 있으며 계산이 끝나면 종료됩니다.

다른 계산을 시작하기 전에 취소 플래그를 지우고 계산을 시작하십시오.

또한 계산을 시작하고 진행 상황을 보여주고 취소 할 수있는 컨트롤이있는 간단한 도구 모음을 피커 위에 배치 할 수 있습니다 (일반적인 방법).

EDIT : 사용자가 조작하려고 할 때 피커가 망가져있는 경우 UIPicker를 서브 클래스 화하고 터치 이벤트를 가로 채고 피커가 터치되는 동안 모든 계산이 취소됩니다. 유일한 복잡성은 사용자가 피커를 "돌리면"안정 될 때까지 기다리는 것이지만 기다리는 시간을 알 수는 없다는 것입니다. 마지막 터치 메시지에 따라 계산을 다시 시작하기 전에 didSelectRow : 또는 시간 초과를 기다리는 데 휴리스틱을 사용해야합니다.

+0

그건 좋은 생각이지만, 문제는 피커 didSelectRow 대리인 (유일한 동작 메시지 인 것 같습니다)이 결코 호출되지 않는다는 것입니다. 기본적으로 피커는 사이클을 위해 굶어 죽어 가고 있습니다. 나는 그것이 어떻게 일어날 지 이해하지 못한다. 나는 픽커를 업데이트하는 타이머 (또는 그것이 무엇이든간에)가 메시지를 큐에 넣을 것이라고 생각한다. 따라서 늦게 업데이트 될 수 있지만 결국 업데이트 될 수 있습니다. 꽤 이해가되지 않습니다 ... –

+0

델리게이트를 설정 했습니까? 델리게이트를 클래스에 설정했는데 다른 객체에 의해 재설정되지 않았습니까? 주 스레드에서 많은 작업을 수행하더라도 어느 시점에서 대리자 메서드를 가져와야합니다. –

+0

네, 대리인이 작동합니다 - 방금 늦었습니다. 계산에 관한 어떤 것에서는 그것을 지연시키는 것뿐입니다. 테스트로서, 버튼을 만들어 동일한 슈퍼 뷰에 배치했습니다. 버튼의 메시지가 계산을 방해 할 수 있습니다. 그리고 버튼의 메시지가 처리 된 후 피커가 업데이트됩니다. 피커 (picker)를 특별히 지연시킬만한 것을 생각해 낼 수 있습니까? –