2

iOS 4.0を使用して、アプリが一時停止されているときにバックグラウンドで画像をダウンロードしようとしています。私が行っているのは、applicationDidEnterBackgroundデリゲート呼び出しを受け取ったときに、1つの非同期を開始しNSURLConnection、アプリデリゲートを接続のデリゲートとして設定することです。しかし、NSURLConnectionどの代表者もコールバックされていません。Wiresharkを使用してネットワーク呼び出しをキャプチャしましたが、要求が成功し、応答も得られたことがわかります。しかし、どのデリゲートメソッドも呼び出されないため、データに対して何もできません。

- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"Application entered background state.");
// UIBackgroundTaskIdentifier bgTask is instance variable
NSAssert(self->bgTask == UIBackgroundTaskInvalid, nil);

bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
    dispatch_async(dispatch_get_main_queue(), ^{
        [application endBackgroundTask:self->bgTask];
        self->bgTask = UIBackgroundTaskInvalid;
    });
}];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://animal.discovery.com/mammals/leopard/pictures/leopard-picture.jpg"] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];
self.connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO] autorelease];
[self.connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[self.connection start];
[request release];
NSLog(@"Sent download request....");
dispatch_async(dispatch_get_main_queue(), ^{
    while([application backgroundTimeRemaining] > 1.0) {
        //Do something..
    }
    [application endBackgroundTask:self->bgTask];
    self->bgTask = UIBackgroundTaskInvalid;
    NSLog(@"Ending background task....");
});
}

アプリケーションがバックグラウンドに移行したときにバックグラウンドで非同期にダウンロードを完了するにはどうすればよいですか?

4

1 に答える 1

0

ダウンロードが実際に完了する前にバックグラウンドタスクを終了しているためだと思います。[application endBackgroundTask:self->bgTask];ダウンロードが終了したとき(成功と失敗の両方)に、呼び出し直後ではなく、NSURLConnectionDelegateメソッドに呼び出しを配置する必要があります。[self.connection start]

于 2011-09-01T13:08:13.597 に答える