2012-10-20 2 views
1

비동기 다운로드를 수행하는 NSOperation 파생 클래스가 있습니다.
다운로드 작업은 주 스레드에서 시작해야하므로 주 스레드에서 응답도 완료됩니다.NSOperation에서 비동기 네트워크 호출을 구현하는 방법

일단 다운로드가 완료되면 NSOperation 내에서 다운로드 한 데이터에 대해 더 많은 작업을 수행하고 싶습니다.

기존의 NSOperation 안에 백그라운드 스레드에서 다운로드가 완료된 후 작업을 다시 얻으려면 어떻게해야합니까?

답변

3

NSOperation에서 주 스레드로 이동하는 대신 NSOperation에서 실행중인 현재 스레드에서 연결을 시작하십시오.

그런 다음 NSPort to the NSRunLoop을 추가하여 NSURLConnection을 활성 상태로 유지하십시오.
이제는 모든 콜백이 연결을 시작한 것과 동일한 스레드에서 수신됩니다. 그리고 이미 배경에있는 추가 작업을 계속 수행 할 수 있습니다.

0

NSOperation은 단순히 관리되는 작업입니다. 주 스레드 외부에서 네트워크 호출을 수행 할 때이 명령을 사용해야합니다.

NSOperation 내부의 비동기 코드를 처리 할 때의 미묘함은 콜백이 반환되기 전에 NSOperation이 완료되고 종료되어 메모리에서 삭제됩니다. NSOperationQueue는 당신의 코드가 비동기임을 알지 못한다.

작업에 기존 runloop을 사용하고 NSOperation에서 명시 적으로 설정을 완료하면 작업을 계속 수행하여 콜백을 수신하고 자체 완료를 표시합니다.

때 아마도 UI를 업데이트 할 블록을 전송하여 메인 스레드로 전화를 걸해야 NSOperation 내부의 코드를 (완료 작업을 설정하기 전에) 비동기 콜백 돌아갑니다.

NSOperation을 완료 한 후에도 아무 것도하지 않을 것으로 예상됩니다. 완료 후 살아 나면 안되는 일회용 작업 객체입니다.

기존 답변에서 제안한 것처럼 NSOperation에서 네트워크 호출 자체만큼 처리해야합니다.

관련 문제