2011-05-02 4 views
0

그래서 iPhone 용 webservice 콘텐츠를 요청하고 검색하는이 응용 프로그램에서 작업하고 있습니다. 내가 처음 실행하는 문제는 다음과 같습니다. 처음 데이터를 요청할 때 네트워크가 느려서 응용 프로그램이 응답하지 않도록 독립 스레드로 생성됩니다. 즉,이 데이터가 다운로드되기 전에 사용자가 현재 페이지에서 벗어나면 예상치 못한 일이 발생할 수 있습니다.폭주하는 프로세스를 중단하는 방법

나는 비교적 간단한 하나의 문제 케이스를 좁히기 위해 관리 해왔다. 나는 중첩 테이블을 가지고 있기 때문에 사용자가 다운로드하는 데 시간이 조금 걸릴 수있는 "메시지"테이블에 들어가면 즉각적으로 다른 메시지 집합을 선택하여 보지 않으면 이전 메시지 집합이 여전히 대기열에 있기 때문에로드가 완료됩니다. 여기

내가 시도 것들 :

1) 내가 작업을 취소했지만, 난 단지 시간의 대기열에 하나의 작업을 할 수 있기 때문에 때문에이 무의미하다, 즉시

2 트리거) 나는 데이터의 수신자가 동일하다는 것을 검증하려했으나 실제 테이블 객체가 두 개의 선택 사이에 있기 때문에 이것은 작동하지 않는다. 단지 다른 데이터 세트가 필요하다.

누구나이 까다로운 스레딩 문제를 해결하는 방법에 대한 일반적인 프로그래밍 제안이 있습니까?

iPhone 관련 참고 사항 : 사용자가 메시지 테이블을 빠져 나올 수 없도록 막을 수 있다면 데이터가 완료 될 때까지 기본적으로 해당보기에 잠겨 있기 때문에이 문제가 발생하지 않습니다. 로드.

감사합니다.

+0

스레드에 대한 참조가 있습니까? 스레드에 대한 참조가있는 경우 스레드를 인터럽트 할 수 있습니다 ... 물론 스레드가 수행중인 작업을 완료 할 때까지 기다리는 것이 더 좋지만 워크 플로에 따라 다릅니다. – Kiril

답변

1

This post에는 iOS 네트워킹 및 스레딩과 관련된 몇 가지 디자인 조언이 있습니다. 그것의 기본 요지는 "명시 적 스레딩을 사용하지 마십시오"이며, 나는 더 동의 할 수 없습니다. NSURLConnection에는 모든 스레딩을 관리하면서 URL에서 비동기 적으로 데이터를로드하는 기능이 내장되어 있습니다. 그들은 또한 마음대로 쉽게 취소 할 수 있습니다.

NSURLConnection 패러다임을 사용하는 경우 요청한보기 컨트롤러를 벗어날 때 보류중인 요청을 취소 할 수 있습니다.

+0

내가 가진 진짜 문제는 요청이 더 이상 보류 상태가 아니며이 스위치가 발생할 때 다운로드 중입니다. 이미 시작된 요청을 취소 할 수 있습니까? –

+0

사용중인 코드에서 NSUrlConnection 하지만 자체 스레드를 생성 한 다음 해당 스레드 내에서 동기 요청을 사용했습니다. 하나의 스레드에서 모든 것을 수행하는 것은 매우 간단한 변경 이었지만 요청을 비동기 적으로 수행했기 때문에 문제없이 취소 할 수있었습니다. ! –

+1

위대한, 그게 바로 당신이 원하는 : 비동기 메인 스레드에 대한 동기 배경 스레드. 다행입니다. –

관련 문제