2011-08-11 4 views
1

나는 작업중인 앱에 대한 다운로드 관리자 기능을 개발 중입니다. 요구 사항으로 최대 세 개의 병렬 다운로드를 지원해야합니다. 같은 델리게이트 객체를 사용하는이 포럼의 코드 예제를 보았고 NSURLConnection 객체의 인스턴스를 여러 개 만들었습니다. 이 접근법에 대한 단점 (나는 틀렸을 수도 있음)은 객체 위임에 대한 모든 콜백이 동일한 스레드에서 발생한다는 것입니다. 이렇게하면 패킷이 스레드에 대기 중 상태가됩니다. 나는 여기서 뭔가를 놓친다.iOS에서 병렬 다운로드

NSInvocationQueue를 수행하고 다른 스레드에서 개별 다운로드를 시작하는 것과 같이이 기능을 구현하는 다른 방법이 없으므로 효율성이 향상됩니다. 이 접근 방식을 사용하면 다운로드마다 진행 상황을 추적하고 다운로드 및 스레드 관리를 일시 중지/다시 시작하기 위해 많은 복잡성이 추가됩니다.

개별 스레드에서 비동기 요청을 만들고 명백한 이유로 동기 연결을 유지하지 않으려합니다. 또한 100MB가 넘는 대형 비디오 파일을 다운로드하고 파일에 직접 저장합니다. 나는 패킷이 어떻게 큐에 대기 할 것인가에 관해서는 조금 불명확하다. 나는 메모리가 부족하거나 메모리가 부족하거나 메인 쓰레드가 응답하지 않을 것이다.

모든 도움말 또는 도움을 주실 수 있습니다.

감사

답변

5

Tommy은 데이터를 다운로드하기 위해 별도의 스레드를 사용하는 것이 일반적으로 그리 효율적이지는 않습니다. 또한 메인 스레드에서 NSURLConnection의 비동기 인터페이스를 사용하는 것보다 메모리 오버 헤드가 높으며 많은 제어를 잃게됩니다 (백그라운드 스레드에서 실행중인 동기 연결을 취소 할 수 없음).

위와 같이, 위임 콜백은 모두 메인 스레드에 대기하지만 일반적으로 다운로드가 완료 될 때까지 데이터 청크를 연결하는 것입니다. 이는 계산 상 매우 저렴합니다.

데이터를 다운로드 한 후 (예 : 축소판 이미지 작성, 구문 분석 등) 데이터를 계산하기 위해 고가의 작업을 수행하려는 경우 연결이 다운로드 완료된 후 해당 작업을 GCD 대기열로 쉽게 보낼 수 있습니다. 그렇게하면 다운로드 프로세스를 제어 할 수 없으며 진행률을 쉽게 표시하거나 실행중인 다운로드를 취소 할 수 있지만 여전히 주 스레드는 차단하지 않습니다.

0

그것은 도움이 될 것입니다 - 당신이 ASINetworkQueue을 사용할 수있는 병렬 다운로드 http://allseeing-i.com/ASIHTTPRequest/

.

+0

사이트에서 더 이상 라이브러리가 유지 관리되지 않는 것으로 보입니다. – Scorchio

1

스레드 및 차단 연결을 사용하는 대신 대리자와 비동기 적으로 NSURLConnection을 사용하는 것이 Apple의 권장 사항입니다. 동일한 스레드에서 여러 NSURLConnections를 사용하면 데이터는 모두 동일한 스레드에서 반환되지만 문제는 아닙니다. 귀하의 코드가 그것을 연결하지 않으면 데이터가 어떻게 든 얽히게되지 않으며 네트워크 성능에 영향을 미치지 않습니다.

단순히 데이터를 가져 오는 프로세스를위한 스레드 시작은 특히 동일한 스레드에서 여러 NSURLConnections를 사용하는 것보다 배터리 사용률이 낮은 경우 효율성이 떨어집니다.

0

당신은 ASIHTTPRequest과 같은 HTTP 클라이언트 라이브러리를 조사해야합니다.

ASIHTTPRequest는 동시성을 쉽게 제한 할 수있는 큐를 사용하여 동시 요청을 처리합니다.ASIHttpRequest 빌린 예 번호 :

- (IBAction)grabURLInTheBackground:(id)sender 
{ 
    if (![self queue]) { 
     [self setQueue:[[[NSOperationQueue alloc] init] autorelease]]; 
    } 

    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestDone:)]; 
    [request setDidFailSelector:@selector(requestWentWrong:)]; 
    [[self queue] addOperation:request]; //queue is an NSOperationQueue 
} 

- (void)requestDone:(ASIHTTPRequest *)request 
{ 
    NSString *response = [request responseString]; 
} 

- (void)requestWentWrong:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
} 

동시성을 변경할 [NSOperationQueue maxConcurrentOperationCount]을 수정한다.

+0

사이트에서 더 이상 라이브러리가 유지 관리되지 않는 것으로 보입니다. – Scorchio

관련 문제