2011-01-02 7 views
7

Hey!アプリケーションのバックグラウンドでiOSアプリケーションをダウンロードして(AppDelegateファイルでダウンロードを実行するなど)、ViewControllerを変更してもダウンロードが中断されたりキャンセルされたりすることはありません。私はまたUIProgressViewオブジェクトを設定するためにダウンロードの進捗状況(0.00000 - 1.00000)を得ることができる必要があります。これはまた- (void)progressDidChangeTo:(int)progress機能が必要であることを意味します。iOSアプリケーションのダウンロード

答えて

18

に役立ちます。 examplesは、バックグラウンドでダウンロードする方法と進行状況を報告する方法を示しています。

私はAppDelegateで何もダウンロードしません。代わりに、私はその目的のためだけに分離されたクラスを作成します。それをMyServiceと呼びましょう。次に、私のアプリケーションデリゲートでそのクラスを初期化します。

このクラスは、シングルトンとして機能したり、シングルトンを必要とする各View Controllerに渡すことができます。

MyServiceクラスでは、ASINetworkQueueといくつかのメソッドを追加して、準備ができたら要求を処理します。

- (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]; 
} 

を使用すると、プログレスバーを設定する必要がある場合:ここでは使用することができASIの例からコードがあります。私はちょうど私たMyServiceクラスでASINetworkQueueのsetDownloadProgressDelegateを公開し、そのような私のViewControllersでそれを設定します:

ところで
[[MyService service] setDownloadProgressDelegate: self.myUIProgressView]; 

。アプリが終了してもダウンロードを続行する必要がある場合は、リクエストのShouldContinueWhenAppEntersBackgroundプロパティをYESに設定することができます。

+0

...私はそうです。 AppDelegateファイルでダウンロードする必要があるので、UIViewControllerを起動したときにダウンロードが停止しないようにします。私は、UIViewControllerを起動してASIHTTPRequestオブジェクトにアクセスさせる方法を知る必要がありますが、オブジェクトをAppDelegateに保持させる必要があります。 –

+0

@hankweb、私はちょうど私の答えを更新しました。 –

+0

問題は、私のアプリがバックグラウンドから戻ってくるたびにreportFailureがASIHTTPRequest.mで呼び出されることです。 あなたの投稿で提案したのと同じ方法で、ShouldContineWhenAppEntersBackgroundをYESに設定しました。 –

3

NSURLConnectionを使用して非同期要求を開始することができます。非同期要求が発生すると、UIはフリーズしません。あなたが使用することができますあなたの進歩を持つために

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

:あなたのような何かをすることによってそれを行うことができます

connection:didReceiveResponse:(NSURLResponse *)response; 

デリゲート呼び出しresponse.expectedContentLengthを検査し、その後

connection:didReceiveData:(NSData *)data 
を使用するために

ダウンロードしたデータの量を追跡し、パーセンテージを計算します。

希望これはちょうどそれがNSURLRequestより方法が容易であり、あなたが必要な正確に何んASIHTTPRequestを使用し、 Moszi

+0

私はASIHTTPRequestを使用してダウンロードする部分を持っていますが、現在開いているUIViewControllerではなくバックグラウンドでダウンロードを実装する方法を知る必要があるので、View Controllerを終了するとダウンロードが続行されます。 –

+0

ダウンロードを管理するためのシングルトンクラスを作成することができます。この方法では、View Controllerが解放されてもこのクラスが使用されます。 (シングルトンパターンウィキペディア:http://en.wikipedia.org/wiki/Singleton_pattern) – Moszi

関連する問題