9

インスタンスを無効にしようとすると奇妙な問題が発生しNSURLSessionます。コードは非常に単純です。View Controller、2 つのボタン (start: と stop:)、および URL 用のテキスト フィールドがあります。

コードの簡単な抜粋:

- (IBAction)start:(id)sender {
    NSURLSessionConfiguration *conf = [NSURLSessionConfiguration backgroundSessionConfiguration:@"conf"];
    self.session = [NSURLSession sessionWithConfiguration:conf delegate:self delegateQueue:nil];
    NSURLSessionDownloadTask *task = [self.session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.url.text]]];
    [task resume];
}

- (IBAction)cancel:(id)sender {

    [self.session invalidateAndCancel];
}

または、必要に応じて、プロジェクト全体:リンク

ここで、ファイルをダウンロードしてみてください ( http://download.thinkbroadband.com/1GB.zip )。

このダウンロードをバックグラウンドで続行したいので、バックグラウンド セッションを使用しています。
セッションは正常に開始され、ダウンロードはバックグラウンドで続行されますが、キャンセルしようとすると (送信invalidateAndCancel)、アクセスがうまくいきません。
ゾンビを有効にしてプロファイリングすると、次のゾンビ オブジェクトが得られます: _NSCFBackgroundDownloadTask.
したがって、NSURLSessionDownloadTask(強力なプロパティを使用して保存する)を保持すると、不正なアクセスは発生しません。しかし、私の知る限り、NSURLSession はそれ自体のタスクを保持する必要があるため、コードの何が問題なのか (ドキュメントに何か不足している可能性がありますか?)、またはバグレポートを提出する必要があるかどうかを理解したいと思います。

ありがとう

4

2 に答える 2

17
  1. より良いバックグラウンド セッション構成識別子を使用してください。これは実際にはあなたのセッションではありません。バックグラウンド セッションは、共有システム セッションへの一種のゲートウェイです。セッションのタスクを、バックグラウンドでアップロードおよびダウンロードを行う他のすべてのアプリのタスクと区別する必要があります。のようなユニークなものを使用してください@"com.company.appname.specialname"

  2. バックグラウンド セッションをキャンセルして無効にすることはあまり意味がありません。あなたはセッションを殺しています。無効にすると二度と使用できなくなります。それはばかげている。やりたいことは、アプリの起動時にバックグラウンド セッションを 1 回作成し、それを永久にそのままにしておくことです (前に述べたように、共有システム セッションへのゲートウェイとして)。何かをキャンセルしたい場合、キャンセルしたいのはtaskです。タスクへの参照を保持して、cancelキャンセルしたい場合に参照できるようにします。または、タスクへの参照を保持したくない場合は、 を呼び出して NSURLSession に現在のタスクのリストを要求できますgetTasksWithCompletionHandler:。タスクは識別子を持つことができるので、必要なものを見つけてそれを伝えるのに問題はないはずですcancel

于 2013-11-16T15:16:11.687 に答える
10

NSURLSessionTaskDelegate多くのデバッグを行った後、次のプロトコル メソッドがデリゲートによって実装されていない場合に発生することがわかりました。

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
}

このメソッドをデリゲートに追加すると、エラーが解決します。「奇妙な」ことは、デリゲートメソッドがオプションとしてマークされているため、必要ではないことです。これはバグだと思うので、バグレポートを提出します。より完全な回答が得られるまで数日待ちます。誰も表示されない場合は、私の回答を正しい回答として作成します。

編集:
誰かが興味を持っている場合は、バックグラウンドでファイルをダウンロードするためのヘルパー クラス プロジェクトを作成します:プロジェクトへのリンク

于 2013-11-16T15:07:44.560 に答える