6

별도의 스레드에서 NSURLConnection을 실행하고 있습니다. (비동기이며 기본 스레드에서 실행 중임을 알고 있습니다.)하지만 NSURLConnection을 호출 할 때도 대리자 호출을하지 않습니다. 부모 스레드를 델리게이트로 전달하십시오. 누구든지이 작업을 수행하는 방법을 알고 있습니까?별도의 스레드에서 비동기 NSURLConnection이 대리자 메서드를 호출하지 못했습니다.

코드 :

-(void)startConnectionWithUrlPath:(NSString*)URLpath { 

//initiates the download connection - setup 
NSURL *myURL = [[NSURL alloc] initWithString:URLpath]; 

myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
[myURL release]; 


//initiates the download connection on a seperate thread 
[NSThread detachNewThreadSelector:@selector(startDownloading:) toTarget:self withObject:self]; 

} 


-(void)startDownloading:(id)parentThread { 

NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 

[NSURLConnection connectionWithRequest:myURLRequest delegate:parentThread]; 
//The delegate methods are setup in the rest of the class but they are never getting called... 

[pool drain]; 
} 

편집 *

내 아이폰 앱의 항목을 다운로드하고 있기 때문에 별도의 스레드에있는 NSURLConnection를 실행해야하는 이유는 다운로드가 때 취소 사용자가 화면을 잠급니다 (사용자가 간단히 홈 버튼을 누르고 앱이 백그라운드로 들어가면 계속됩니다). 이 문제는 메인 스레드에서 비동기 적으로 연결을 실행했기 때문에 발생하는 것으로 알고 있습니다.

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO]; 
    [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [connection start]; 
    [connection release]; 

를하지만 나는 화면 잠금이 취소되고 다운로드에 대한 이와 같은 문제가 있습니다 :

있는 NSURLConnection을 시작할 때 나는 또한 (NOT 별도의 스레드에서)이 코드를 시도했습니다.

* UPDATE

(제임스 웹스터의 대답은 스레드의 출사에 대하여도 정확하다는 것을 유의하시기 바랍니다) 애플 문서 설명 아래 토마스 '대답에 추가하려면 : "일시 중단 상태 -이 앱은에 백그라운드는 코드를 실행하지 않습니다. 시스템은 앱을 자동으로이 상태로 옮기고 그렇게하기 전에 알려주지 않습니다. 일시 중지 된 상태에서 앱은 메모리에 남아 있지만 코드는 실행하지 않습니다. "

사용자가 화면을 잠그면 앱이 백그라운드 상태가되고 즉시 일시 중지 상태가되므로 모든 실행이 중단되어 다운로드가 중단되고 경고 메시지가 표시되지 않습니다. 사용자가 화면을 잠 갔지만 아직 화면을 찾지 못했다는 알림이있을 수 있습니다.

따라서 앱이 백그라운드로 들어가면 일시 중지 (특정 정보를 저장하고 NSURLConnection을 취소)하여 다시 다운로드 할 때 HTTP Range 헤더로 다시 시작합니다. 이것은 사용자 환경에 부정적인 영향을주는 백그라운드에서 다운로드가 발생하지 않기 때문에 좋지만 이상적이지 않은 해결 방법입니다.

+0

NSURLConnection 요청에 사용하는 메서드는 비동기이므로 새 스레드를 분리하지 않아도 다중 스레드 작업이 수행됩니다. – Ravin

+0

수정 된 질문은 내 문제를 더 잘 설명합니다. – Zigglzworth

답변

1

를, 당신의 -startDownloading 방법의 끝 즉시 도달하고 스레드가 종료됩니다.

실제로 주 런 루프에서 연결을 예약해야합니다 (또는 GCD 사용).

장치 잠금은 다른 문제입니다. 장치가 잠겨 있으면 배터리 수명을 절약하기 위해 응용 프로그램이 일시 중지됩니다. 다운로드를 완료하려면 an extra amount of time when suspending을 요청할 수 있습니다.

+0

감사합니다. 나는 당신의 답을 토대로 내 질문을 업데이트했다. 더 많은 시간을 요구하는 것은 일시 중지 된 앱이 아닌 배경에있는 앱에만 해당됩니다. – Zigglzworth

0

나는 문제가있는 NSURLConnection 당신이 startDownloading: 메시지를 종료하면 해제 된 (또는 더 정확하게 오토 릴리즈 풀을 배출 할 때)

그러나 나는 당신의 방법론 어쨌든 조금 어색한 것 같아요 것이있을 것 같아요 . NSURLConnection 당신이 그것을 사용하는 방식은 비동기이며 어쨌든 스레드 될 것으로 보입니다.

이 시도하고 그것이 작동하는 경우에 예상대로 표시 (예 : 연결이 바쁜 동안 일시 정지하지 않는 응용 프로그램) 당신의있는 NSURLConnection 비동기이기 때문에

-(void)startConnectionWithUrlPath:(NSString*)URLpath { 

    //initiates the download connection - setup 
    NSURL *myURL = [[NSURL alloc] initWithString:URLpath]; 

    myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    [myURL release]; 

    [NSURLConnection connectionWithRequest:myURLRequest delegate:self]; 
} 
+0

문제를 더 잘 설명하기 위해 수정 된 질문입니다. – Zigglzworth

+0

네, 편집이 의미가 있습니다. 내 대답의 첫 번째 비트에주의를 기울이십시오. NSURLConnection이 거의 즉시 할당 취소 된 것 같습니다. –

+0

이 답변은 질문을 업데이트 할 때도 올바른 것으로 언급되었습니다. – Zigglzworth

관련 문제