2011-01-02 5 views
7

안녕하세요! 나는 iOS 응용 프로그램이 응용 프로그램 백그라운드에서 다운로드를 시작하도록 (AppDelegate 파일에서 다운로드를 실행하는 것과 같이) 어떻게 ViewController를 변경해도 다운로드가 중단되거나 취소되지 않도록 할 수 있어야합니다. 또한 UIProgressView 개체를 설정하려면 다운로드 진행률 (0.00000 - 1.00000)을 얻을 수 있어야합니다. 이는 - (void)progressDidChangeTo:(int)progress 기능이 필요하다는 것을 의미합니다.iOS 애플리케이션 배경 다운로드

답변

18

그냥이 NSURLRequest보다 훨씬 쉽게 그리고 정확하게 당신이 필요로하지 ASIHTTPRequest를 사용합니다. 백그라운드에서 다운로드하는 방법과 진행률을보고하는 방법을 보여주는 examples입니다.

AppDelegate에서 직접 아무것도 다운로드하지 않습니다. 대신 나는 그 목적을 위해서 분리 된 클래스를 만들 것이다. Let 's call MyService 그러면 앱 위임자에서 그 클래스를 초기화 할 것입니다.

클래스는 싱글 톤으로 작동하거나이를 필요로하는 각보기 컨트롤러에 전달할 수 있습니다.

MyService 클래스에서 ASINetworkQueue 클래스와 몇 가지 메소드를 추가하여 준비가되면 요청을 처리합니다. 다음은 사용할 수있는 ASI 예제의 코드입니다.

- (IBAction)startBackgroundDownloading:(id)sender 
{ 
    if (!self.queue) { 
     self.queue = [[[ASINetworkQueue 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 
    [self.queue go]; 
} 

- (void)requestDone:(ASIHTTPRequest *)request 
{ 
    NSString *response = [request responseString]; 
    //Do something useful with the content of that request. 
} 

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

진행률 표시 줄을 설정해야하는 경우. 난 그냥 내이면 MyService 클래스에 ASINetworkQueue의 setDownloadProgressDelegate 노출과 같은 내 ViewControllers에서 설정합니다 :

[[MyService service] setDownloadProgressDelegate: self.myUIProgressView]; 

을 BTW. 앱이 종료 된 후에도 계속 다운로드해야하는 경우 ShouldContinueWhenAppEntersBackground 요청을 YES로 설정할 수 있습니다.

+0

... 나는 있습니다. 다운로드를 시작한 UIViewController가 시작될 때 중단되지 않도록 AppDelegate 파일에서 다운로드가 필요합니다. UIViewController를 시작하고 ASIHTTPRequest 객체에 액세스 할 수 있지만 AppDelegate에 객체를 보유하는 방법을 알아야합니다. –

+0

@hankweb, 방금 내 대답을 업데이트했습니다. –

+0

문제는 reportFailure가 내 앱이 백그라운드에서 돌아올 때마다 ASIHTTPRequest.m에서 호출된다는 것입니다. 게시물에서 제안한 것과 같은 방법으로 ShouldContineWhenAppEntersBackground를 YES로 설정했습니다. –

3

NSURLConnection을 사용하여 UI를 동결시키지 않는 비동기 요청을 시작할 수 있습니다.

connection:didReceiveData:(NSData *)data 
을 사용하여 다음 response.expectedContentLength을 검사하고

connection:didReceiveResponse:(NSURLResponse *)response; 

대표 전화 : 당신이 사용할 수 있습니다 진행을하기 위해

NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url]; 
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
[urlRequest release]; 

: 당신은 뭔가를 수행하여 작업을 수행 할 수 있습니다

다운로드 한 데이터의 양을 추적하고 백분율을 계산하십시오. 이 도움이

희망, Moszi는

+0

ASIHTTPRequest를 사용하여 다운로드 할 수있는 부분이 있습니다. 현재 열려있는 UIViewController가 아닌 백그라운드에서 시작되도록 다운로드를 구현하는 방법을 알아야하므로,보기 컨트롤러가 닫히면 다운로드가 계속됩니다. –

+0

다운로드 관리를위한 싱글 톤 클래스를 만들 수 있습니다. 이렇게하면 뷰 컨트롤러가 할당 해제 된 경우에도이 클래스가 주위에있게됩니다. (싱글 톤 패턴 위키 백과 : http://en.wikipedia.org/wiki/ 싱글 톤 패턴) – Moszi

관련 문제