www.example.com/number에서 읽으면 임의의 숫자를 얻습니다. 내 iPhone 앱에서는 각 요청이 완료된 후 해당 주소에서 계속해서 읽고 새 번호를 화면에 표시 할 수 있기를 원합니다. 뷰가로드되는 즉시이 프로세스를 시작한다고 가정 해 보겠습니다. 마지막으로, 부채로 웹 요청을 단순화하기 위해 ASIHTTPRequest을 사용하고 있습니다.NSTimer를 사용하지 않고 연속 배경 스레드를 사용하여 iPhone UI를 업데이트 할 수 있습니까?
접근 방식 1 : 내 viewDidLoad 메서드에서 루프에서 URL에서 동기식으로 읽을 수 있습니다 (HTTP 요청의 응답을받을 때까지 실행이 계속되지 않음). 장점 : 요청은 연속적이며 요청에 응답 할 수 있습니다. 단점 : 기능을 종료하지 않고 런타임 루프를 다시 제어하기 때문에 UI가 업데이트되지 않습니다. 분명히 이것은 좋은 해결책이 아닙니다.
접근 방식 2 : 내 viewDidLoad 메서드에서 초당 한 번 fetchURL 함수를 호출하는 타이머를 만듭니다. 장점 : 각 요청은 별도의 스레드에 있으며 각 요청이 완료되면 UI가 업데이트됩니다. 단점 : 요청은 별도의 스레드에 있으므로 제대로 제어 할 수 없습니다. 예를 들어 첫 번째 요청에 연결 시간 제한이있는 경우 오류 팝업을 표시하고 설정이 변경 될 때까지 추가 요청이 발생하지 않도록 할 수 있습니다. 그러나이 방법을 사용하면 제한 시간까지 3 초가 걸리면이 시간에 두 개의 추가 요청이 이미 시작되었습니다. 방금 타이머를 느리게하면 연결이 제대로 작동 할 때 데이터가 너무 느리게 들어옵니다.
내가 언급 한 처음 두 가지 접근법의 장점을 통합 할 수있는 접근법이있는 것처럼 보입니다. 나는 이전 요청의 결과에 따라 다음 요청을 보내지 않을지 여부를 결정할 수있는 방법을 원합니다.
접근법 3 : 나는 더 빨리 발사하는 타이머 (0.25 초마다 말하기)를 사용했지만 타이머 기능을 사용하여 다음에 무엇을 할지를 알 수있는 플래그를 확인하도록했습니다. 따라서 이전 요청이 완료되면 오류가 발생하지 않는 한 새로운 요청을 보냅니다. 그렇지 않으면 이전 요청이 완료되지 않은 경우 새 요청을 보내지 않고 타이머 기능이 반환됩니다. 이 타이머를 더 빠르게 실행하면 응답 시간이 향상되지만 깃발을 통해 원하는 동기화를 얻을 수 있습니다.
접근법 3이 내가 원하는 것을 할 것 같지만 약간의 강제력이있는 것으로 보입니다. 누구나 이것에 대한 더 나은 접근 방법에 대한 제안을 갖고 있습니까? 아니면 접근 방식 3과 같은 것이 가장 좋은 방법입니까?
다른 답변은 ... ** 응용 프로그램에서 절대로 적극적으로 폴링해서는 안된다는 것을 추가하고 싶습니다. ** 그렇게하면 배터리가 소모되고 응답 성이 저하됩니다. – bbum