2

그래서 내 모든 REST를 할 노력하고있어 시작 NSOperationQueue에 NSOperation을 추가하면 백그라운드 스레드에서 다운로드 데이터 있도록 UI가 응답 유지하는 것이 호출합니다.비동기 ASIHTTPRequest

NSOperationQueue가 포함 된 viewcontroller가 있습니다. NSOperation의 하위 클래스 인 가져 오기 클래스의 인스턴스를 만듭니다. 내 수입업자의 main() 메소드 내부에서 ASIHTTPDataRequest를 설정하고있다. 나는 요청을 만든 다음 요청을 시작하는 시간을 만든다.

문제점 : 요청시 "startAsynchronous"를 호출하여 문제가 발생했습니다. 대리인 콜백은 결코 호출되지 않습니다. 요청 시작과 마찬가지로 데이터를 다운로드하지만 대리자 콜백 메소드를 호출하지 않습니다.

내 솔루션 : 요청을 동 기적으로 시작할 때 모든 것이 정상적으로 작동하는 것 같습니다 (예 : 콜백 등). 이것이 올바른 해결책입니까?

동기 호출이 작동하지만 비동기 호출이 작동하지 않는 이유는 무엇입니까? 나는 사과 "TopSongs"샘플 후 내 수입 클래스를 모델링 해요.

답변

1

main() 메서드가 실행되는 시점이 끝나면 NSOperation이 완료 및 해제되도록 설정되어 있으므로 대리인이 릴리스되므로 더 최신 대리자 콜백을받을 수 있습니다. 메인 스레드에서 실행하는 경우 자체 ASIHTTPRequest

+0

외부는 "TopSongs"샘플은 내가 같은 일을한다. [[NSURLConnceciton alloc] initWithRequest : delegate : self]를 사용합니다. 어떤 비동기뿐만 아니라, 그리고 그것은 잘 작동합니다. 그래서 ASIHTTPReqeust의 startAsynchronous 호출과 관련이있는 것처럼 보일 것입니다. – Bryan

+0

다음과 같은 코드를 사용 했습니까? do { [[NSRunLoop currentRunLoop] runMode : NSDefaultRunLoopMode beforeDate : [NSDate distantFuture]]; } while (! done); – jamapag

+0

예. ASIHTTPRequest 내부에서이 문제를 일으키는 것으로 의심됩니다. 비동기 테스트 디버깅 나는 위에 나열된 "do ... while"루프 다음에 라인에 도달하지 않는다는 것을 알았다. 그 코드는 do/while 문을 통해 떨어지며 그 아래의 어떤 코드도 실행하지 않습니다. – Bryan

6

은 UI를 차단하지 않아야합니다.

  • ASIHTTPRequest는 백그라운드 스레드에서 실행되도록 설계되지 않았습니다. [ASIHTTPRequest requestFinished]은 주 스레드에서 "완료된"콜백을 호출합니다. 백그라운드 스레드에 의해 절대 수신되지 않으므로 백그라운드 스레드의 실행 루프는 절대로 실행되지 않습니다.
  • ASIHTTPRequest는 NSOperation 어쨌든입니다. 이것은 구현 세부 사항입니다.
  • ASIHTTPRequest는 기본적으로 백그라운드 스레드에서 네트워크 코드를 실행하기 때문에 다른 스레드에 그대로두면 많은 이점을 얻지 못할 수 있습니다.

오랜 시간이 걸리는 데이터를 구문 분석하는 경우 작업에 적용하십시오. 대신있는 NSURLConnection의 ASIHTTPRequest를 사용하여 내

+0

으로 토론 이동 요청이 완료된 후 REST 요청 호출을 내 NSOperation으로 옮긴 주된 이유는 동일한 백그라운드 스레드에서 코어 데이터를 구문 분석하고 저장하며 UI 응답을 유지하고 핵심 데이터가 업데이트 된 주 스레드에 알리고 따라서 주 스레드에서 내 테이블을 업데이트 할 수 있도록합니다. – Bryan

+0

그래서 파싱/저장을 다른 스레드에 집어 넣고 메인 스레드의 내용을 조정하십시오. –

+0

나는 내가 현재 이것 (http://stackoverflow.com/questions/5274236/why-is-nstimer-blocked-while-another-thread-is-running)에 의해 찌르 게되고 있다고 생각한다. 완료 핸들러가 주 스레드에서 실행되고 있고 그 스레드를 시작한 스레드가 아니라는 이유로 추론을 얻지 못합니다. 완료 핸들러에서 다운로드 한 데이터를 처리해야하는 경우가 종종 있지만,이 방법을 사용하면 완료 핸들러에서 새 스레드를 생성하지 않으면 불가능합니다. –